当执行带有n(例如10000)粒子的系统的计算机仿真时,通常的工作流程涉及以给定的间隔频繁保存系统的状态。这将需要在文件中写下所有粒子的位置坐标(因此,每行3个浮点/ double ,粒子的每一行),以及一些 header 信息。 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个值,而不是3个值,因此,即使从原点而不是粒子的先前位置引用所有位置,文件也应小30%(假设存储 vector 时需要更高的精度) 。
  • 位置坐标的“随机性”如何?如果存在某种关联,那么我会将数据保留在文本中,并使用无损文件压缩方法(例如,建议将文件保存在支持文件系统压缩的磁盘上-这意味着您无用!)任何重复的字符串如果数据中包含重复的字符串,则将被压缩并且比二进制文件更有效。如果坐标显示为伪随机,则压缩(如ZIP格式)不会为您带来任何好处,您应该使用二进制值方法。
  • 如果以二进制(甚至可能以文本形式)存储,则在将浮点值写入文件之前,请考虑将其转换为适合您的体积/精度的整数。这将比存储浮点(或更糟的 double )值占用的空间少得多。当然,这假定您可以在int(或long)的精度内表示所需的精度。
  • 关于c++ - 优化:缩小C或C++中的文件大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58395488/

    10-12 00:27
    查看更多