производительность fwrite () значительно ниже емкости диска
У меня есть динамически распределенный массивstruct
с 17 миллионами элементов. Чтобы сохранить его на диск, я пишу
fwrite(StructList, sizeof(Struct), NumStructs, FilePointer)
На более позднем этапе я прочитал его с эквивалентнымfread
утверждение, то есть используяsizeof(Struct)
и подсчетNumStructs
, Я ожидаю, что результирующий файл будет около 3,5 ГБ (это все x64).
Можно ли вместо этого пройтиsizeof(Struct) * NumStructs
как размер и1
как рассчитывать, чтобы ускорить это? Я почесал голову, почему операция записи может занятьминут на быстром компьютере с 32 ГБ ОЗУ (много кеша записи). Я запустил тесты самонаведения, и кэш достаточно агрессивен, поэтому обычно 400 МБ / с для первых 800 МБ - 1 ГБ. PerfMon показывает, что он потребляет 100% одного ядра во время fwrite.
Я видел вопросВот так что я спрашиваю, есть ли внутри fwrite какой-то цикл, который можно «обмануть», чтобы он шел быстрее, сказав ему написать 1 элемент размера n * s, а не n элементов размера s.
РЕДАКТИРОВАТЬ
Я запускал это дважды в режиме релиза и оба раза отказывался от ожидания. Затем я запустил его в режиме отладки, зная, что обычноfwrite
операции занимают больше времени. Точный размер записываемых данных составляет 4 368 892 928 байт. Во всех трех случаях PerfMon показывает два всплеска активности записи на диск с интервалом около 30 секунд, после чего процессор переходит на 100% одного ядра. Файл на тот момент 73 924 608 байт. У меня есть точки останова по обе стороны отfwrite
так что я знаю, где он сидит. Кажется, что-то застряло, но я оставлю это работать на ночь и посмотрю.
РЕДАКТИРОВАТЬ
Оставил это на ночь, и он определенно зависfwrite
Файл никогда не превышал 70 МБ.