我有 3 个 vector ,每个 vector 恰好有 256^3 ~ 1600 万个元素,我想将它们存储在一个文件中并尽快读取。我只关心读取性能,数据在内存中的表示可以是任意的。
我已经了解了一些序列化技术以及使用 ofstream 将纯数字写入文件/从文件读取纯数字,但是我想知道是否有更直接、更快速的方法。
(我对 C++ 及其概念还很陌生)
最佳答案
假设两个系统,windows 和 android,都是 little endian,这在 ARM 和 x86/x64 CPU 中很常见,您可以执行以下操作。
首先:确定具有特定大小的类型,因此要么是 double(64 位),float(32 位),要么是 uint64/32/16 或 int64/32/16。不要使用诸如 int
或 long
之类的东西来确定您的数据类型。
第二种:使用下面的方法写入二进制数据:
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();
请注意,在读取数据之前必须知道数据的大小。
注意:这段代码超出了我的理解范围。我还没有测试过它,但它应该可以工作。
现在,如果目标系统没有相同的字节序,您必须分批读取数据,翻转字节序,然后将其放入您的 vector 中。如何翻转字节顺序得到了广泛讨论 here .
为了确定您的系统的字节顺序,这已被讨论 here .
对性能的惩罚将与这些系统的不同程度成正比。如果它们都是相同的字节顺序并且您选择了相同的数据类型和大小,那么您就很好并且具有最佳性能。否则,您将受到一些惩罚,具体取决于您必须进行多少次转换。这是您所能达到的最快速度。
来自评论的注意事项:如果您要传输 double 或 float ,请确保两个系统都使用 IEEE 754 标准。使用这些非常普遍,比字节顺序更重要,但只是为了确定。
现在,如果这些解决方案不适合您,那么您必须使用适当的序列化库来为您标准化格式。有图书馆可以做到这一点,例如 protobuf .
关于c++ - 从文件中读取 vector<double> 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54238956/