2016-11-07 2 views
0

Я разработал диспетчер загрузки с динамическим алгоритмом сегментации, например IDM для большого файла, поскольку многосегментная загрузка, потоки пишутся в разных пространствах файла, которые, возможно, имеют расстояние 4 ГБ. по причине это запись возможности снижение очень. Я не знаю, как быстро написать эти данные Я попытался выиграть api WriteFile Вместо Stream.Write, но я обнаружил, что проблема в том, что проблема связана с движением hdd Я пробовал MemoryMappedFile с 5MB ViewStream в памяти для каждого сегмента, скорость записи но не так, как я ожидал. psudo-код использования MemoryMappedFile выглядит следующим образом. может быть, мой подход с использованием неверно отображение файла в памятьFast Write Huge File Multi Segmented C#

create MemoryMappedFile 
for each segment 
create 5MB ViewStream 
write to memory stream 
if data passed 5 MB or passed end of segment then close ViewStream and Create new ViewStream if not passed end of segment 
+0

Какая польза? думаю, что мой файл составляет 5 ГБ, если я создаю 50 * 100 МБ снова голова должна переместиться через 5 ГБ пространства, чтобы писать во всех файлах. Моя проблема в том, что количество запросов в секунду в этой области очень велико. – Hamid

+0

Ваша сеть быстрее, чем ваши диски? Получите RAID хорошего SSD, чтобы соответствовать. –

+0

нет, это не 10MB Network Speed ​​и около 80 MB HDD Write Speed ​​ – Hamid

ответ

1

Я предлагаю вам использовать стандартный поток implemenetation вместо WinAPI. Вместо того, чтобы писать в одном файле - попробуйте записать в разные файлы, а затем объедините их вместе. Таким образом, жесткий диск сможет выполнять запись без операции поиска в конкретную позицию в файле (это, вероятно, причина, по которой запись происходит настолько медленно).

Что касается вашего вопроса о перемещении по 5 ГБ - это проблема с HDD в первую очередь, у него есть собственный буфер для решения таких проблем, и он решает его довольно хорошо.

Когда вы пишете много небольших файлов, HDD будет решать, как он может переупорядочить содержимое в буфере для повышения эффективности. Например, он может хранить куски данных в буфере, и когда пришло время писать некоторые данные, он будет писать его за один раз (один круг). Как вы видите, это также поможет вам многопоточно писать ваши записи, потому что вы пишете в совершенно разных положениях в буфере.

+0

Да, это причина, но вы можете объяснить, как несколько файлов решают проблему? IDM загрузить увеличенный файл с очень высокой скоростью записи в моем hdd – Hamid

+0

Я обновил свой ответ. – eocron

+0

tnx Я прочитаю его и сообщит вам, какой размер для небольших файлов имеет лучшую производительность? – Hamid