在对具有 n
(例如 10000)个粒子的系统进行计算机模拟时,通常的工作流程涉及以给定的时间间隔频繁保存系统状态。这将需要在文件中写下所有粒子的位置坐标(因此每行 3 个 float / double ,每行一个粒子),以及一些标题信息。 float 精度设置为固定值。
我通常保存/写下我的配置文件的方式如下(调用时创建文件的函数的一部分):
#include <iostream>
#include <fstream>
ofstream outfile(filelabel, ios::out);
outfile.precision(10);
outfile << "#Number of particles " << npart << endl;
for (int i=0; i<npart; i++){
outfile << particle[i].pos[0] << " " << particle[i].pos[1] << " " << particle[i].pos[2] << endl;
}
outfile.close();
通常,对于足够大的系统,每个此类文件的大小为 0.5-4 MB,因此当经常保存它们时,它们最终会加起来很大。所以我正在尝试学习如何将配置文件的大小优化到最低限度,例如通过(想到的 2 个想法):
- 使用不同的写入方法,不一定要写入“.txt”文件。
- 可能在写入文件之前压缩(例如压缩)数据。
对于如何在 C/C++ 可能性范围内缩小配置文件大小的任何建议和建议,我们将不胜感激。
小补遗
根据目前的建议,二进制格式的保存似乎是一种很好的替代方法,但是,作为后续问题,是否可以在 Python 中读取二进制保存的数据?
这与保存的配置文件相关,我倾向于使用 Python 进行后期分析。
最佳答案
四点建议:
保存 vector 信息(方向和偏移)应该比保存 X-Y-Z 坐标占用更少的空间。但这意味着保留对初始状态文件的引用 - 这需要更多的计算。
假设上述方法不可行,如果存储空间比计算时间更重要,我仍然会考虑使用 vector 。 3D vector 以 2 个值而不是三个值对位置进行编码,因此即使您从原点而不是粒子的先前位置引用所有位置,文件也应该小近 30%(假设存储 vector 需要更高的精度) .
位置坐标有多“随机”?如果存在某种相关性,那么我会将数据保存在文本中并使用无损文件压缩方法(例如建议将文件保存在支持文件系统压缩的磁盘上 - 这意味着没有对你有用!) 任何重复的字符串都将被压缩并且可能比二进制文件更有效 - 如果数据具有重复的字符串。如果坐标出现伪随机,则压缩(如 ZIP 格式)不会给您带来任何好处,您应该使用二进制值方法。
如果以二进制形式存储(甚至可能以文本形式),请考虑在将浮点值写入文件之前将其转换为适合您的体积/精度的整数。这将比存储浮点(或更糟的 double )值占用更少的空间。这当然假设您需要的精度可以在
int
(或long
)的精度内表示。
关于c++ - 优化 : Shrinking file size in C or C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58395488/