Форматирование невероятно дорого. Запись 128M чисел двойной точности на диск с помощью fprintf () и fwrite () может легко занять 10 раз дольше из-за форматирования и большого количества вызовов (по сравнению с одним большим fwrite ()); попробуйте приведенный ниже код и посмотрите, получите ли вы похожие тайминги. Текстовые файлы не способ справиться со значительными объемами данных; если вы на самом деле не собираетесь сесть и прочитать все сами, это не должно быть в ascii.
Если вы делаете хотите остаться с текстом, и вы навязываете жесткий формат (например, все числа занимают одинаковое количество байтов в файле), то вы можете разбить список на большие блоки, и каждое ядро форматирует один набор чисел в большую строку, а fseek () в соответствующую позицию в файле и выводит ее. Вы можете поиграть с размером блока, чтобы увидеть, какой лучший компромисс между памятью и производительностью. Если вы действительно ограничены процессором, это должно позволить вам совмещать ввод-вывод с вычислениями и получить некоторый выигрыш.
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
/* Jonathan Dursi, SciNet */
#define FILESIZE 1024*1024*128
int write_file_bin(const char *fname, const double *data, const int ndata) {
FILE *fp;
time_t start, end;
fp=fopen(fname,"wb");
assert(fp);
start = time(NULL);
fwrite(data, sizeof(double), ndata, fp);
end = time(NULL);
fclose(fp);
return (int)(end-start);
}
int write_file_ascii(const char *fname, const double *data, const int ndata) {
FILE *fp;
time_t start, end;
int i;
fp=fopen(fname,"wb");
assert(fp);
start = time(NULL);
for (i=0;i<ndata;i++) {
fprintf(fp,"%lf\n",data[i]);
}
end = time(NULL);
fclose(fp);
return (int)(end-start);
}
int main(int argc, char **argv) {
double *data;
int i;
int asciitime, bintime;
data = (double *)malloc(FILESIZE * sizeof(double));
assert(data);
for (i=0;i<FILESIZE;i++) {
data[i] = i*(double)i/2.;
}
asciitime = write_file_ascii("data.txt",data,FILESIZE);
bintime = write_file_bin("data.dat",data,FILESIZE);
printf("Time to write files: ASCII: %d, Binary: %d\n",asciitime, bintime);
return 0;
}