Я пишу программу, которая должна подавлять ноль для 3000+ файлов .dat по 500 МБ каждый, на компьютере Windows с 46 логическими ядрами и 128 ГБ ОЗУ. Я использую 30 потоков, поэтому каждый поток должен работать с более чем 100 файлами. Первым шагом является декодирование файлов .dat, созданных дигитайзером, для этого мне был передан исходный файл C с чем-то вроде этого:
out_file=fopen(output_file.txt, "w");
ptr_myfile=fopen(Data_0.dat, "rb");
uint32_t nwords = 0;
int16_t wfm_adc;
i=0;
offset=0;
while(i<NSAMPLE){
fseek(ptr_myfile,offset,SEEK_SET);
fread(&nwords, 4, 1, ptr_myfile);
wfm_adc = (int16_t)(nwords & 0xFFFF);
fprintf(out_file, "%d\n", wfm_adc);
i++;
wfm_adc = (int16_t)((nwords & 0xFFFF0000) >> 16);
fprintf(out_file, "%d\n", wfm_adc);
i++;
offset = offset + 4;
}
Насколько я понимаю, он читает 4 байта данных одновременно и записывает 2 + 2 байта в файл.
Данные в выходном файле выглядят примерно так
-96
-139
-115
-143
-119
-188
-408
-1355
Работает нормально, единственная проблема в том, что он очень медленный, около 250 миллионов выборок и примерно 250 секунд требуется, чтобы просто прочитать данные из файла, даже не записав в файл с помощью fprintf, так как каждый поток должен для декодирования более 100 файлов это займет 25000 секунд на поток.
Есть ли способ улучшить это? Я читал, что, читая больше данных с помощью fread, вместо 4 байтов, скажем, 64Kb, было бы меньше затрат на вызов fread, но я не нашел способа затем получить нужные мне данные и записать их в файл.