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