Performance 存储1万亿行信息的最佳方式

Performance 存储1万亿行信息的最佳方式,performance,storage,space,Performance,Storage,Space,我正在计算,结果文本文件现在有288012413行,有4列。样本列: 288012413; 4855 18668 5.5677643628300215 该文件的容量接近12GB 那太不合理了。这是纯文本。有没有更有效的方法?我只需要大约3位小数,但是限制器会节省很多空间吗?将第4个字段减少到3位小数会将文件减少到8GB左右。将第4个字段减少到3位小数会将文件减少到8GB左右。如果只是阵列数据,我会研究类似HDF5的内容: 该格式受大多数语言支持,具有内置压缩功能,并且得到了很好的支持和广泛使

我正在计算,结果文本文件现在有288012413行,有4列。样本列:

288012413; 4855 18668 5.5677643628300215
该文件的容量接近12GB


那太不合理了。这是纯文本。有没有更有效的方法?我只需要大约3位小数,但是限制器会节省很多空间吗?

将第4个字段减少到3位小数会将文件减少到8GB左右。

将第4个字段减少到3位小数会将文件减少到8GB左右。

如果只是阵列数据,我会研究类似HDF5的内容:


该格式受大多数语言支持,具有内置压缩功能,并且得到了很好的支持和广泛使用。

如果它只是数组数据,我将研究类似HDF5的内容:

该格式受大多数语言支持,具有内置压缩功能,并且得到了良好的支持和广泛使用。

  • 第一列看起来很像行号——如果是这样的话,你可以去掉它,每行大约节省11个字符
  • 如果只需要大约3位小数,则可以舍入/截断最后一列,每行可能再节省12个字符
也就是说,每行可以去掉23个字符。该行有40个字符长,因此您可以将文件大小大约减半

如果对最后一列进行四舍五入,则应注意四舍五入误差对计算的影响-如果最终结果需要精确到3 dp,则可能需要根据计算类型保留两个额外的精度位数

如果文件仅用于存储结果,您可能还需要研究压缩该文件。

  • 第一列看起来很像行号——如果是这样的话,你可以去掉它,每行大约节省11个字符
  • 如果只需要大约3位小数,则可以舍入/截断最后一列,每行可能再节省12个字符
也就是说,每行可以去掉23个字符。该行有40个字符长,因此您可以将文件大小大约减半

如果对最后一列进行四舍五入,则应注意四舍五入误差对计算的影响-如果最终结果需要精确到3 dp,则可能需要根据计算类型保留两个额外的精度位数


如果文件仅用于存储结果,您可能还需要研究压缩该文件。

好吧,如果文件太大,并且您正在进行的计算需要任何精度的数字,那么您将不需要限制器。这可能弊大于利,对于12-15GB的文件,这样的问题将很难调试。我会使用一些压缩工具,比如GZIP、ZIP、BlakHole、7ZIP或类似的东西来压缩它


另外,您使用的是什么编码?如果您只是存储数字,那么您所需要的只是ASCII码。如果您使用的是Unicode编码,那么与ASCII相比,文件的大小将增加一倍到四倍。

好吧,如果文件那么大,并且您进行的计算需要任何精度的数字,那么您就不需要限制器了。这可能弊大于利,对于12-15GB的文件,这样的问题将很难调试。我会使用一些压缩工具,比如GZIP、ZIP、BlakHole、7ZIP或类似的东西来压缩它


另外,您使用的是什么编码?如果您只是存储数字,那么您所需要的只是ASCII码。如果您使用的是Unicode编码,那么与ASCII相比,文件的大小将翻倍到四倍。

继续使用MySQL数据库

  • MSSQL express的限制为4GB
  • MS Access的限制为4 GB

因此,这些选择已经过时。我认为,使用像mysql或sSQLLite这样的简单数据库而不进行索引将是最好的选择。无论如何,使用数据库访问数据可能会更快,而且文件大小可能更小。

继续使用MySQL数据库

  • MSSQL express的限制为4GB
  • MS Access的限制为4 GB

因此,这些选择已经过时。我认为,使用像mysql或sSQLLite这样的简单数据库而不进行索引将是最好的选择。无论如何,使用数据库访问数据可能会更快,而且文件大小可能更小。

如果要将结果用作查找表,为什么要对数字数据使用ASCII?为什么不这样定义一个结构:

struct x {
   long lineno;
   short thing1; 
   short thing2;
   double value;
}

然后将结构写入二进制文件?由于所有记录的大小都是已知的,因此以后很容易遍历它们。

如果要将结果用作查找表,为什么要对数字数据使用ASCII?为什么不这样定义一个结构:

struct x {
   long lineno;
   short thing1; 
   short thing2;
   double value;
}

然后将结构写入二进制文件?由于所有记录的大小都是已知的,因此以后通过这些记录很容易。

就像AShelly一样,但要小一些

假设直线是连续的

结构x{ 短小的东西1; 短小的东西2; short value;//您说的只有3dp。所以存储为固定点n*1000。dp剩下2位 }

保存在二进制文件中

lseek()read()和write()是您的朋友


文件将很大(ish),大约为1.7Gb。

与AShelly一样,但更小

假设直线是连续的

结构x{ 短小的东西1; 短小的东西2; short value;//您说的只有3dp。所以存储为固定点n*1000。dp剩下2位 }

保存在二进制文件中

lseek()read()和write()是您的朋友


文件将非常大(ish),大约为1.7Gb。

最明显的答案就是“拆分数据”。将它们放在不同的文件中,例如,每个文件有1百万行。NTFS非常擅长处理每个文件夹中成千上万的文件

那你就有号码了