Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2013, 15:51   #1
VikaR
Пользователь
 
Регистрация: 01.07.2011
Сообщений: 21
Вопрос Заполнить диск случайными данными

Необходимо записать напрямую на физический диск случайные данные. Диск может не иметь файловой системы.
Пробую таким образом:

Код:
    hDevice := CreateFile(PAnsiChar(device), GENERIC_READ or GENERIC_WRITE, // device = '\\.\PHYSICALDRIVEn'
      FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
    if (hDevice = 0) or (GetLastError() <> 0) then
    begin
      ShowMessage(SysErrorMessage(GetLastError()));
      Exit;
    end;
    successfullWrite := True;
    while successfullWrite do
    begin
      Application.ProcessMessages;
      SetLength(byteArray, BUF_SIZE);
      i := 0;
      while i < BUF_SIZE do
      begin
        Randomize;
        byteArray[i] := Random(255);
        Inc(i);
      end;
      successfullWrite := WriteFile(hDevice, byteArray[0], BUF_SIZE, writtenBytes, nil);
    
      end;
    end;
    CloseHandle(hDevice);
Но скорость записи, как бы я не менял размер буфера, не поднимается выше 1Мбайт/сек.
Как можно повысить эту скорость? Или же подскажите, как иначе можно программно затереть данные с диска без ФС
VikaR вне форума Ответить с цитированием
Старый 17.03.2013, 17:04   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Во-первых, Ваша программа НЕ делает требуемого, а именно записи случайных данных.
И мешает ей в этом процедура Randomize, которая переинициализирует ДПСЧ числом, которое отнюдь не является (псевдо)случайным.
Randomize нужно вызывать не более одного раза за все время работы программы.
Да и Random нужно делать не от 255, а от 256.

Но это - не единственный пример того, что внутри цикла Вы делаете работу, которую нужно выносить за пределы цикла.
Например, BUF_SIZE внутри цикла не изменяется, так зачем каждый раз переустанавливать длину byteArray?

И еще: коль скоро Ваш вопрос не о том, работает программа или нет, а о производительности, то замечу, что для этого в Вашем сообщении недостает много существенно информации.
- что собой представляет тот физический диск, на который Вы пытаетесь писать? Каковы его характеристики?
- какова величина BUF_SIZE?


На второй вопрос: достаточно писать просто нули либо какое угодно другое число. В частности, один раз подготовить буфер с псевдослучайными числами и использовать его без пересчета на каждом шаге.
s-andriano вне форума Ответить с цитированием
Старый 17.03.2013, 17:37   #3
VikaR
Пользователь
 
Регистрация: 01.07.2011
Сообщений: 21
По умолчанию

Замечания справделивые, но на производительность лишние действия в цикле оказывают незначительное влияние в данном случае. В отладчике видно, что практически все время уходит именно на запись.

Размер буфера 65536. При уменьшении буфера скорость падает, при увеличении, как и говорил, скорость не меняется.

Пробовал на HDD Seagate 120GB, подключение через адаптер SATA-USB.

Ан нет, признаю - был не прав. Вынес определение буфера из цикла, и скорость выросла. При буфере 1Мбайт запись на уровне 20Мбайт/сек

Последний раз редактировалось VikaR; 17.03.2013 в 17:59.
VikaR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнить массив из 10 елементов случайными числами SpENCeR C++ Builder 2 24.04.2012 20:51
Заполнить одномерный массив случайными числами. С++ JustKaissy Помощь студентам 7 27.09.2011 11:49
Заполнить массив случайными числами. Fender92 Паскаль, Turbo Pascal, PascalABC.NET 4 19.03.2011 17:05
заполнить массив случайными вещественными числами (C#) _RaWeN_ Общие вопросы C/C++ 2 14.03.2011 19:02
Заполнить массив случайными числами forumu Общие вопросы Delphi 13 03.12.2007 22:11