【问题标题】:Write Raw Numbers to Disk将原始数字写入磁盘
【发布时间】:2014-10-24 12:33:07
【问题描述】:

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

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

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

【问题讨论】:

  • 你是如何写入磁盘的?
  • 写入磁盘的有效数字有多少?多久一次(例如,每秒一次、每分钟一次、尽可能快地循环……)?
  • 一般写全数,能写的越快越好。最初使用 write csv 或通过常规 Python IO 编写。

标签: python c++ disk diskspace


【解决方案1】:

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

它可以让您存储大量的数值数据,而且很容易 处理来自 NumPy 的数据。例如,您可以切片成 存储在磁盘上的数 TB 数据集,就好像它们是真正的 NumPy 数组。数以千计的数据集可以存储在一个文件中, 根据需要进行分类和标记

它还有一个C++ API

HDF5 格式在科学计算社区中被广泛使用,并且可以被许多软件读取/写入。使用parallel utility tools可以快速处理HDF5格式的数据。

【讨论】:

  • 这是我将使用的解决方案,因为它是我跳过的完整解决方案。谢谢!
【解决方案2】:

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

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

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

【讨论】:

  • 我以前怎么没见过简单的小“保存”功能?!这看起来很棒!
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    在优化之前,请确保您至少正在执行类似的操作(将您的数字类型以二进制表示形式存储在磁盘上)。如果到了这一步,文件还是太大了,可以考虑采用不同类型的压缩格式。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-02
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2021-08-18
      相关资源
      最近更新 更多