优化:使用C或C ++缩小文件大小

问题描述 投票:1回答:1

[当对具有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种想法):

  • 使用不同的写入方法,不一定写入'.txt'文件。
  • 可能在写入文件之前压缩(例如,压缩)数据。

关于如何在C / C ++可能性内缩小配置文件大小的任何建议和建议,将受到高度赞赏。

c++ optimization fstream filesize
1个回答
0
投票

四个建议:

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

  2. 假设以上方法不切实际,那么如果存储空间比计算时间更关键,我仍然会考虑使用向量。 3D向量将位置编码为2个值,而不是3个值,因此,即使从原点而不是粒子的先前位置引用所有位置,文件的大小也应缩小近30%(假设存储向量的精度更高) 。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.