C++ 优化:以C或C+缩小文件大小+;

C++ 优化:以C或C+缩小文件大小+;,c++,optimization,fstream,filesize,C++,Optimization,Fstream,Filesize,当对含有n(例如10000)粒子的系统执行计算机模拟时,通常的工作流程涉及以给定的间隔频繁保存系统的状态。这需要在一个文件中写下所有粒子的位置坐标(因此每行3个浮动/双倍,每行一个粒子),以及一些标题信息。浮动精度设置为固定值 我通常保存/写入配置文件的方式如下(在调用时创建文件的函数的一部分): #包括 #包括 流输出文件(文件标签,ios::out); 输出文件精度(10); outfile4条建议: 保存矢量信息(方向和偏移)所占用的空间应小于保存X-Y-Z坐标所占用的空间。但这意味着要保

当对含有
n
(例如10000)粒子的系统执行计算机模拟时,通常的工作流程涉及以给定的间隔频繁保存系统的状态。这需要在一个文件中写下所有粒子的位置坐标(因此每行3个浮动/双倍,每行一个粒子),以及一些标题信息。浮动精度设置为固定值

我通常保存/写入配置文件的方式如下(在调用时创建文件的函数的一部分):

#包括
#包括
流输出文件(文件标签,ios::out);
输出文件精度(10);
outfile4条建议:

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

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

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

  • >P>如果以二进制形式存储(甚至在文本中),请考虑将浮点值转换成适合您的卷/精度的整数,然后再将它们写入文件。这将比存储浮点(或更糟糕的双精度)值占用更少的空间。当然,这假设您需要的精度可以在
    int
    (或
    long
    )的精度范围内表示


    你能在你的文件系统上启用压缩吗?你需要这些文件是可移植的吗?如果不是,则将原始代码二进制数据直接写入二进制模式下打开的文件中保存原始二进制数据。对于以后的问题,请不要添加无关的语言标记,例如C++标记的C++问题。将值存储在原始二进制文件中而不是文本中,也意味着不必担心再现性。(当再次加载到同一台机器/程序上时)。@SomeProgrammerDude使用时也允许往返。非常感谢!哦,位置是非常随机的!关于第4点,请您扩展一个可能的虚拟示例,好吗?确实目标精度是已知的(小数点后10位),如果我继续使用二进制格式,我能用Python加载/读取它吗?@user929304转换为
    int
    的意思是使用最小距离定义空间,例如,如果坐标以米为单位,但总体积小于10m^3,并且有10个小数位,那么最大坐标值为10^12。不幸的是,这对于
    int
    来说太大了,但它很容易适合
    long
    。遗憾的是,
    long
    的大小与
    double
    的大小相同。另一方面,如果您有10个小数位,但最大的值是<0.01,那么您的
    int确实少于一个
    的精度。无论如何,我会使用vector方法。@user929304忘了提到:既然你说位置是随机的,那么我可能会放弃使用文本压缩的想法。它通过查找重复模式并将其编码为较小的代码来工作。如果文本是随机的,压缩文件实际上会稍微大一些我真的认为存储矢量数据是一种方法。我认为压缩后的文件比原始的.txt文件小,但比二进制文件大。虽然这很容易检查。我的意思是用一种好的压缩方法压缩文本文件,如xz@user929304您的错误似乎出现在铸造中,但是是另一个问题的主题,而不是继续这里的主题。
    #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();