2012-04-18 15 views
6

Bardzo potrzebuję generatora plików losowych, który generuje prawdziwie losowe, nieściśliwe pliki obojętne.Generator plików losowych (ponownie!)

Skończyłem z tym kodem delphi. Działa , ale to boleśnie sloooow

var 
    Buf  : Integer; 
    TheFile : TFileStream; 
begin 
     TheFile := TFileStream.Create(FileName, fmCreate OR fmOpenReadWrite); 
     with TheFile do 
     begin 
      for i := 0 to FileSize do // Iterate 
      begin 
       Buf := Random(999999) * i; 
       WriteBuffer(Buf, SizeOf(Buf)); 
      end; // for 
     end; // with 
end, 

Moje pytanie brzmi: Czy istnieje szybko losowy generator plików, które można używać? Oba kod i/lub wywołania, Delphi narzędzia są dopuszczalne, o ile:

  1. mogę go uruchomić na Windows bez ręcznej interwencji (muszę to dla moich testów, nie interwencja jest dozwolona)
  2. To szybka
  3. pliki generowane jest nieściśliwy (tj. wyniki kompresji generowanych plików w przestrzeni bez zapisywania)

EDIT Dla zainteresowanych mogę zastosować radę otrzymałem tutaj i made this function, to wystarczająco szybko & 7zip ma twardy czas ściskając wygenerowanych danych.

+0

Opisz swój kod i dowiedz się, gdzie spędza najwięcej czasu. – japreiss

+0

Prawdopodobnie lepiej jest użyć CryptoAPI wypełniającego bufor, który jest używany do zapisu do pliku. Istnieje pewien kod C - http://msdn.microsoft.com/en-us/library/aa382048.aspx, który jest dobrym punktem wyjścia. – Petesh

+0

Jakiego rodzaju jest Buf? Jakiego rodzaju jest? Czy zakończenie powinno być "FileSize-1"? –

Odpowiedz

9

Użyj 4096-bajtowego rozmiaru strony lub wielostronicowego bufora. Zapisywanie jednej liczby całkowitej na raz będzie wolne.

+0

Uzgodnione. Problemem jest tu I/O. –

+5

@ChrisThornton W rzeczywistości nie będzie to wąskie gardło we/wy, ale narzut wywoływania 'WriteFile'. System operacyjny będzie miał warstwę buforującą. –

1

Możesz użyć mojego skryptu generate_random_file.py (Python 3), który użyłem do wygenerowania danych testowych w moim projekcie.

  • Działa zarówno w systemie Linux, jak i Windows.
  • Jest bardzo szybki, ponieważ używa os.urandom() do generowania losowych danych w porcjach 256 KiB zamiast generowania i zapisywania każdego bajtu osobno.
+0

@Will: Jak śmiesz nazwać ten spam? Tak, wysłałem tę odpowiedź w 3 powiązanych pytaniach, ale jest to ogólnie akceptowalne (http://meta.stackexchange.com/questions/17455/is-it-ok-that-i-just-posted-my odpowiedzi na kilka pytań). Jeśli chcesz poprawić moją odpowiedź, powiedz mi dlaczego. Po prostu usunięcie go to zła praktyka. – robert