【发布时间】:2016-10-28 15:16:17
【问题描述】:
我正在编写一个程序,该程序需要将一个大型二进制文件(大约 12 GiB 或更多)写入磁盘。我创建了一个小测试程序来测试这个功能。虽然为缓冲区分配 RAM 内存不是问题,但我的程序不会将数据写入文件。该文件仍然是空的。即使是 3.72 GiB 文件。
//size_t bufferSize=1000; //ok
//size_t bufferSize=100000000; //ok
size_t bufferSize=500000000; //fails although it is under 4GiB, which shouldn't cause problem anyways
double mem=double(bufferSize)*double(sizeof(double))/std::pow(1024.,3.);
cout<<"Total memory used: "<<mem<<" GiB"<<endl;
double *buffer=new double[bufferSize];
/* //enable if you want to fill the buffer with random data
printf("\r[%i \%]",0);
for (size_t i=0;i<(size_t)bufferSize;i++)
{
if ((i+1)%100==0) printf("\r[%i %]",(size_t)(100.*double(i+1)/bufferSize));
buffer[i]=rand() % 100;
}
*/
cout<<endl;
std::ofstream outfile ("largeStuff.bin",std::ofstream::binary);
outfile.write ((char*)buffer,((size_t)(bufferSize*double(sizeof(double)))));
outfile.close();
delete[] buffer;
【问题讨论】:
-
double *buffer=new double[bufferSize]; std::vector 怎么样 - 更安全。
-
声明
streamsize ssz = bufferSize*sizeof(double);并打印出来。也许转换为`streamsize 是一个问题。虽然它对我有用。 -
老实说,我不知道您在写入调用参数中要使用
double(sizeof(double))做什么。同样,对于散布在此代码中的大多数双重结构。如果你的平台上的size_t不能保持bufferSize * sizeof(double)的值,double的中间温度,然后转换回size_t,不会让一切变得更好。您在size_t bufferSize=500000000; //fails...的评论本身就令人担忧。 -
神圣多余的 printfs 蝙蝠侠!您每 100 个元素打印一次填充数组的进度 - 这将花费 非常 很长时间。考虑仅打印 100 次进度 - 即,仅当整数百分比发生变化时 -
if ((i+1)%(bufferSize/100)==0)似乎更加理智。另请注意,ofstream.write 的第二个参数应该是 signed - size_t 只是unsigned int的别名。 -
使用
size_t指定大小,而不是double。