desempenho do fwrite () bem abaixo da capacidade do disco
Eu tenho uma matriz alocada dinamicamente de umstruct
com 17 milhões de elementos. Para salvá-lo em disco, escrevo
fwrite(StructList, sizeof(Struct), NumStructs, FilePointer)
Em uma etapa posterior, li com um equivalentefread
declaração, ou seja, usandosizeof(Struct)
e uma contagem deNumStructs
. Espero que o arquivo resultante tenha cerca de 3,5 GB (isso é tudo x64).
Em vez disso, é possível passarsizeof(Struct) * NumStructs
como o tamanho e1
como a contagem para acelerar isso? Estou coçando a cabeça por que a operação de gravação pode demorarminutos em um computador rápido com 32 GB de RAM (bastante cache de gravação). Eu executei benchmarks de fabricação caseira e o cache é agressivo o suficiente para que 400 MB / s para os primeiros 800 MB a 1 GB sejam típicos. O PerfMon mostra que está consumindo 100% de um núcleo durante a gravação.
Eu vi a perguntaaqui Então, o que estou perguntando é se existe algum loop interno no fwrite que pode ser "enganado" para ir mais rápido, dizendo-lhe para escrever 1 elemento do tamanho n * s em oposição a n elementos do tamanho s.
EDITAR
Eu executei isso duas vezes no modo de lançamento e, nas duas vezes, desisti de esperar. Em seguida, executei-o no modo de depuração, sabendo que normalmente ofwrite
as operações demoram muito mais. O tamanho exato dos dados a serem gravados é de 4.368.892.928 bytes. Nos três casos, o PerfMon mostra duas explosões de atividade de gravação em disco com aproximadamente 30 segundos de intervalo, após o que a CPU atinge 100% de um núcleo. O arquivo está nesse ponto 73.924.608 bytes. Eu tenho pontos de interrupção em ambos os lados dofwrite
então eu sei que é onde está sentado. Certamente parece que algo está preso, mas vou deixá-lo funcionando durante a noite e ver.
EDITAR
Deixou isso durante a noite e definitivamente ficoufwrite
, o arquivo nunca passou dos 70 MB.