[当对具有n
(例如10000)粒子的系统进行计算机模拟时,通常的工作流程涉及以给定的间隔频繁保存系统的状态。这将需要在文件中写下所有粒子的位置坐标(因此,每行3个浮点/双精度,粒子的每一行),以及一些标头信息。浮动精度设置为固定值。
我通常保存/记下配置文件的方式如下(该函数在每次调用时都会创建文件的一部分):
#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种想法):
关于如何在C / C ++可能性内缩小配置文件大小的任何建议和建议,将受到高度赞赏。
四个建议:
保存矢量信息(方向和偏移)应比保存X-Y-Z坐标占用更少的空间。但这意味着保留对初始状态文件的引用-这需要更多的计算量。
假设以上方法不切实际,那么如果存储空间比计算时间更关键,我仍然会考虑使用向量。 3D向量将位置编码为2个值,而不是3个值,因此,即使从原点而不是粒子的先前位置引用所有位置,文件的大小也应缩小近30%(假设存储向量的精度更高) 。
位置坐标如何“随机”?如果存在某种关联,那么我会将数据保留在文本中,并使用无损文件压缩方法(例如,建议将文件保存在支持文件系统压缩的磁盘上-这意味着no为您工作!)如果数据具有重复字符串,则重复的字符串字符串将被压缩,并且比二进制文件更有效。如果坐标显示为伪随机,则压缩(如ZIP格式)不会为您带来任何好处,您应该使用二进制值方法。
如果以二进制(也许甚至以文本形式)存储,则在将浮点值写入文件之前,请考虑将其转换为适合您的体积/精度的整数。与存储浮点值(或更糟糕的是双精度)相比,这将占用更少的空间。当然,这假定您可以在int
(或long
)的精度范围内表示所需的精度。