我正在编写一个程序,该程序在具有46个逻辑内核和128 GB RAM的Windows机器上,对3000个.dat文件(每个500 MB)进行零抑制。我正在使用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
它工作正常,唯一的问题是它非常慢,大约有2.5亿个样本,仅从文件中读取数据就花费了大约250秒,甚至没有使用fprintf写入文件,因此每个线程都必须解码100多个文件,仅此一个线程就需要25000秒。 有办法改善吗?我已经读过,通过读取更多的数据,而不是读取4个字节(例如64Kb),调用读取的数据会减少开销,但是我还没有找到一种方法来获取所需的数据并将其写入文件。