将原始数字写入磁盘

时间:2014-08-30 19:52:51

标签: python c++ disk diskspace

我想到我不知道如何将原始数值写入磁盘。 我将如何在Python或C ++中执行此操作?!

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

将数值写入磁盘会因为浮点数占用的磁盘空间明显减少,还是有一些其他开销我不考虑?

4 个答案:

答案 0 :(得分:2)

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

如果您使用Python处理数字数据,那么您几乎肯定会使用numpy。如果您没有使用numpy,则应该使用numpy,这很棒。

numpy数组中获取数据后,您可以使用他们的save方法。

答案 1 :(得分:2)

Python中的一般方法是使用struct module

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

(您可以选择使用的字节顺序 - 我使用!来指示网络字节顺序以便于移植 - 或者不使用指示符来使用本机字节顺序。实际上,我不确定IEEE 754是否指定一个字节排序,所以我不确定要推荐什么。也许使用默认值是最好的。)

答案 2 :(得分:2)

最通用且功能最强大的选项是在HDF5 format的帮助下使用Python interface。来自网站:

  

它可以让您轻松存储大量数值数据   操纵来自NumPy的数据。例如,您可以切入   存储在磁盘上的多TB数据集,就像它们是真正的NumPy一样   阵列。成千上万的数据集可以存储在一个文件中,   按照你想要的分类和标记

它还有C++ API

HDF5格式广泛用于科学计算社区,并由许多软件读/写。可以使用parallel utility tools快速操作HDF5格式的数据。

答案 3 :(得分:1)

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

#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;
}