2012-04-18 7 views
6

Мне очень нужен генератор случайных файлов, который генерирует действительно случайных, не сжимаемых файлов-манекенов.Генератор случайных файлов (снова!)

Я закончил с этим кодом delphi. Это работает, но это болезненно 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, 

Мой вопрос: Есть ли быстро генератор случайных файлов, которые я могу использовать? Оба Delphi код и/или командная строка инструментов приемлемы до тех пор, как:

  1. Я могу запустить его на Windows, без ручного вмешательства (мне это нужно для моих тестов, никакого вмешательства не допускается)
  2. Это быстро
  3. файлы генерируемый несжимаемая (то есть. сжатие сгенерированных файла результатов не экономии пространства)

EDIT Для тех, кто заинтересован, я применил совет, который я получил здесь и made this function, это достаточно быстро & 7zip имеет трудное время сжатия сгенерированные данные.

+0

Профилируйте свой код и узнайте, где он проводит больше всего времени. – japreiss

+0

Он, вероятно, лучше использовать CryptoAPI, заполняя буфер, который используется для записи в файл. Существует некоторый код C - http://msdn.microsoft.com/en-us/library/aa382048.aspx, который является хорошей отправной точкой – Petesh

+0

Какой тип Buf? Какой тип я? Должно ли окончание быть «FileSize-1»? –

ответ

9

Используйте 4096-байтный размер страницы или несколько буферов размера страницы. Написание одного целого за раз будет медленным.

+0

Согласен. Здесь проблема ввода-вывода. –

+5

@ChrisThornton На самом деле это будет не тот ввод-вывод, который будет узким местом, а накладными расходами на вызов 'WriteFile'. ОС будет иметь буферный уровень. –

1

Вы можете использовать мой сценарий generate_random_file.py (Python 3), который я использовал для генерации тестовых данных в моем проекте.

  • Он работает как на Linux, так и на Windows.
  • Это очень быстро, потому что он использует os.urandom() для генерации случайных данных в кусках 256 KiB вместо генерации и записи каждого байта отдельно.
+0

@Will: Как вы посмели назвать этот спам? Да, я опубликовал этот ответ по 3 связанным вопросам, но это обычно считается приемлемым (http://meta.stackexchange.com/questions/17455/is-it-ok-that-i-just-posted-my -same-ответ к нескольким, связанным с-вопросов). Если вы хотите, чтобы я улучшил свой ответ, тогда скажите мне, почему. Простое удаление - это плохая практика. – robert