c++ - 优化 : Shrinking file size in C or C++

标签 c++ optimization fstream filesize

在对具有 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 进行后期分析。

最佳答案

四点建议:

  1. 保存 vector 信息(方向和偏移)应该比保存 X-Y-Z 坐标占用更少的空间。但这意味着保留对初始状态文件的引用 - 这需要更多的计算。

  2. 假设上述方法不可行,如果存储空间比计算时间更重要,我仍然会考虑使用 vector 。 3D vector 以 2 个值而不是三个值对位置进行编码,因此即使您从原点而不是粒子的先前位置引用所有位置,文件也应该小近 30%(假设存储 vector 需要更高的精度) .

  3. 位置坐标有多“随机”?如果存在某种相关性,那么我会将数据保存在文本中并使用无损文件压缩方法(例如建议将文件保存在支持文件系统压缩的磁盘上 - 这意味着没有对你有用!) 任何重复的字符串都将被压缩并且可能比二进制文件更有效 - 如果数据具有重复的字符串。如果坐标出现伪随机,则压缩(如 ZIP 格式)不会给您带来任何好处,您应该使用二进制值方法。

  4. 如果以二进制形式存储(甚至可能以文本形式),请考虑在将浮点值写入文件之前将其转换为适合您的体积/精度的整数。这将比存储浮点(或更糟的 double )值占用更少的空间。这当然假设您需要的精度可以在 int(或 long)的精度内表示。

关于c++ - 优化 : Shrinking file size in C or C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58395488/

相关文章:

optimization - 客户端能否可靠地为写入数据库的对象生成 PK?

c++ - 从文件中删除特定行

c++ - 为二进制数据创建字符串缓冲区的最佳方法

c++ - 透视投影与光线追踪/光线转换的效率

optimization - 所有对最大不相交路径算法

c++ - 使用 seekg 和 seekp 得到错误的输出

c++ - 运行涉及 struct tm 的 C++ 程序的 Unix 错误

c++ - QRubberBand,如何选择项目??? QT 文档根本没有帮助

c++ - 为什么这个enable_if函数模板不能专用于VS2017?

python - 在 postgreSQL 中查看表是否没有行的最快方法是什么?