繁体   English   中英

将原始数字写入磁盘

[英]Write Raw Numbers to Disk

在我看来,我不知道如何将原始数值写入磁盘。 我将如何在Python或C ++中做到这一点?

我正在运行一些模拟并将中间结果写入磁盘,以使它在崩溃时不会从头开始。 可悲的是,这些值在我的硬盘驱动器上占用了千兆字节的空间。

以浮点数的形式将数值写入磁盘会占用更少的磁盘空间,还是我没有考虑其他开销?

您可以滚动自己的二进制格式并使用它,但这可能不是一个好主意。

如果使用Python处理数字数据,则几乎可以肯定使用numpy 如果你不使用numpy ,你应该考虑使用numpy ,这很棒。

一旦将数据存储在numpy数组中,就可以使用它们的save方法。

Python中的一般方法是使用struct模块

import struct
print struct.pack("!d", 3.14159)

(你可以选择使用什么字节顺序 - 我用!来指示网络字节顺序的可移植性 - 或者不使用指示器来使用本机字节排序。实际上,我不确定IEEE 754是否指定字节顺序,所以我'我不知道该推荐什么。也许使用默认值是最好的。)

最通用和最强大的选项是在Python界面的帮助下使用HDF5格式 来自网站:

它使您可以存储大量的数值数据,并轻松地从NumPy中操纵该数据。 例如,您可以切片存储在磁盘上的多TB数据集,就好像它们是真正的NumPy数组一样。 数千个数据集可以存储在一个文件中,可以根据需要分类和标记

它还有一个C ++ API

HDF5格式在科学计算社区中被广泛使用,并且可以通过许多软件进行读取/写入。 使用并行实用工具可以快速操作HDF5格式的数据。

在优化之前,请确保至少执行类似的操作(将数字类型存储在磁盘上的二进制表示形式)。 如果您在此时并且文件大小仍然太大,则可以考虑不同类型的压缩格式。

#include <iostream>
#include <fstream>

typedef int32_t my_numeric_type;

int main()
{
    using namespace std;

    {
        ofstream output_file("numbers.dat", ios::binary);
        if( !output_file )
        {
            cout << "Failed to open file for writing" << endl;
            return 1;
        }

        for( my_numeric_type i = 0 ; i <= 1000; ++i )
            output_file.write(reinterpret_cast<const char*>(&i), sizeof(i));
    }

    {
        ifstream input_file("numbers.dat", ios::binary);
        if( !input_file )
        {
            cout << "Failed to open file for reading" << endl;
            return 1;
        }

        my_numeric_type i;
        while( input_file.read(reinterpret_cast<char*>(&i), sizeof(i)) )
            cout << i << endl;
    }

    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM