c++ - 从文件中读取 vector<double> 的最快方法

标签 c++

我有 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。不要使用诸如 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();

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

注意:这段代码超出了我的理解范围。我还没有测试过它,但它应该可以工作。

现在,如果目标系统没有相同的字节序,您必须分批读取数据,翻转字节序,然后将其放入您的 vector 中。如何翻转字节顺序得到了广泛讨论 here .

为了确定您的系统的字节顺序,这已被讨论 here .

对性能的惩罚将与这些系统的不同程度成正比。如果它们都是相同的字节顺序并且您选择了相同的数据类型和大小,那么您就很好并且具有最佳性能。否则,您将受到一些惩罚,具体取决于您必须进行多少次转换。这是您所能达到的最快速度。

来自评论的注意事项:如果您要传输 double 或 float ,请确保两个系统都使用 IEEE 754 标准。使用这些非常普遍,比字节顺序更重要,但只是为了确定。

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

关于c++ - 从文件中读取 vector<double> 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54238956/

相关文章:

c++ - 清除组合 C/C++ 文件中的错误

c++ - 当 Base 和 Derived 都使用 Derived 类型参数进行模板化时调用 Base 构造函数时出现编译器错误

c++ - Qt错误: symbol(s) not found for architecture x86_64 on Mac OS X Yosemite

C++类静态变量问题 - C programmer new to C++

c++ - Gstreamer 在 Opencv 中写入管道默默地死去

c++ - 如何在 ListView win32 api 中删除指针

c++ - ID2D1HwndRenderTarget 总是有黑色背景而不是透明

c++ - OpenCV 不会加载图像

c++ - 遍历作为 QList<int> 的 QVariant?

java - 无法在 AMD 64 位平台 JNI 上加载 IA 32 位 .dll