从文件读取向量<double>的最快方法

时间:2019-01-17 15:17:21

标签: c++

我有3个向量,每个向量正好有256 ^ 3〜16百万个元素,我想存储在文件中并尽可能快地读取。我只关心读取性能,内存中的数据表示形式可以是任意形式。

我已经研究了一些序列化技术以及使用ofstream向文件中写入/读取纯数字的方法,但是我想知道是否有更直接,更快速的方法。

(我对C ++及其概念还很陌生)

1 个答案:

答案 0 :(得分:1)

假设Windows和android这两个系统都是低字节序的,这在ARM和x86 / x64 CPU中很常见,则可以执行以下操作。

首先:确定具有单独大小的类型,以便使用64位双精度型,使用32位浮点型或uint64 / 32/16或int64 / 32/16。请勿使用intlong之类的东西来确定您的数据类型。

第二:使用以下方法写入二进制数据:

std::vector<uint64_t> myVec;
std::ofstream f("outputFile.bin", std::ios::binary);
f.write(reinterpret_cast<char*>(myVec.data()), myVec.size()*sizeof(uint64_t));
f.close();

在这种情况下,您将获取原始数据并将其二进制格式写入文件。

现在在其他计算机上,请确保您使用的数据类型具有相同的数据类型大小和相同的字节序。如果两者相同,则可以执行以下操作:

std::vector<uint64_t> myVec(sizeOfTheData);
std::ifstream f("outputFile.bin", std::ios::binary);
f.read(reinterpret_cast<char*>(&myVec.front()), myVec.size()*sizeof(uint64_t));
f.close();

请注意,在读取数据之前必须知道数据的大小。

注意:此代码不在我脑海中。我没有测试过,但是应该可以。

现在,如果目标系统的字节序不同,则必须分批读取数据,翻转字节序,然后将其放入向量中。 here广泛讨论了如何翻转字节序。

要确定系统的字节顺序,here对此进行了讨论。

性能损失将与这些系统的差异成正比。如果它们都是相同的字节序,并且您选择相同的数据类型和大小,那么您就很好,并且您具有最佳性能。否则,您将受到一定的惩罚,具体取决于您必须进行多少次转化。这是您可以获得的最快的速度。

注释说明:如果要传送双精度或浮点数,请确保两个系统都使用IEEE 754标准。可以肯定的是,使用它们的方式比按字节顺序排列的要普遍得多。

现在,如果这些解决方案不适合您,那么您必须使用适当的序列化库来为您标准化格式。有一些库可以做到这一点,例如protobuf