Улучшение декодирования файла .dat - PullRequest
0 голосов
/ 06 ноября 2018

Я пишу программу, которая должна подавлять ноль для 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, но я не нашел способа затем получить нужные мне данные и записать их в файл.

...