将大量数字保存到硬盘驱动器

时间:2011-11-28 17:53:36

标签: c++ memory vector

我使用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。

3 个答案:

答案 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);
}