我使用unsigned short类型的向量在RAM中分配了一大块连续字节。
vector<unsigned short> testDump(204800000);
for(int k = 0; k<204800000; k++)
testDump[k] = 9; \\ This is different in my real program
现在我想将此矢量保存到我的硬盘驱动器中。如何以及最快的方式是什么?数据的大小相当大(约1/2 GB)。我尝试了以下方法:
ofstream outfile("allMyNumbers.txt", ios::out | ios::binary);
outfile.write(&testDump[0], testDump.size());
但我收到以下错误:
cannot convert parameter 1 from 'unsigned short *' to 'const char *'
完成任务的最快方法是什么,即使用最快的方法将矢量保存到文件中?
*该平台是Windows 7。
答案 0 :(得分:3)
一种独立于平台的技术是使用ostream_iterator
作为vector-class所持有的类型。由于您的向量包含的类型已经为operator<<
类类型的ostream
重载,因此您不应该为向量类型的ostream_iterator
类实例化模板。然后,您可以将ostream_iterator
与来自STL的copy
算法结合使用,以迭代向量,并将原始字节序列化为文件。使用operator<<
将比使用ofstream::write
消耗更多数据,vector<unsigned short> testDump(2048000000);
//...fill in your vector
ofstream outfile("allMyNumbers.txt", ios::out | ios::binary);
//tab-delinate the data
ostream_iterator<unsigned short> o_iter(outfile, "\t");
copy(testDump.begin(), testDump.end(), o_iter);
将原始二进制数据写入磁盘,但具有序列化数据的优势,使其可以在任何平台上独立读取。
例如:
{{1}}
答案 1 :(得分:3)
你可以只是投射指针。
outfile.write(reinterpret_cast<char*>(&testDump[0]), testDump.size() * sizeof(unsigned short));
请注意,生成的文件的格式将特定于您的特定平台/实现。所以你不一定能在一台不兼容的机器上以明显的方式回读它。
在Windows上,这将为您提供一个400MB-ish文件,每个204800000字节对表示一个小端无符号短路。
这应该相当快。我发现很难相信你的任务确实是“使用最快的方法”来保存数据。怎么会有人知道你的代码真的是最优的,没有其他代码能够以一纳秒的速度更快地完成它?如果要付出额外的努力来削减纳秒,那又有什么意义呢?等等。
当然,使用快速流压缩算法来减少所需的磁盘空间可能会更快,因为操作可能受磁盘I / O的约束。但代码会复杂得多,无论是否有帮助都取决于数据的可压缩程度。
答案 2 :(得分:1)
一种跨平台的序列化方法是简单地固定小端表示并转储所有短路。这样可以避免Jason解决方案中的ASCII数据膨胀,同时又是跨平台的。
所以,我会做
ofstream outfile("allMyNumbers.data", ios::out | ios::binary);
for(int k = 0; k < testDump.size(); k++)
{
unsigned short leData = htole16(testDump[k]);
outfile.write(&leData, sizeof(leData));
}
htole16(16位整数的小端主机)的实现如下:
对于x86,x64:
unsigned short htole16(unsigned short x)
{
return x;
}
对于像Sparc / PowerPC这样的大端机器(虽然这些都不会运行Windows 7)
unsigned short htole16(unsigned short x)
{
return _byteswap_ushort(x);
}