我想到我不知道如何将原始数值写入磁盘。 我将如何在Python或C ++中执行此操作?!
我正在运行一些模拟并将中间结果写入磁盘,以便它在崩溃时不会从头开始。 可悲的是,这些值在我的硬盘驱动器上占用了几千兆字节的空间。
将数值写入磁盘会因为浮点数占用的磁盘空间明显减少,还是有一些其他开销我不考虑?
答案 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;
}