在 C# 中将大型双数组保存为文件的最有效方法

Posted

技术标签:

【中文标题】在 C# 中将大型双数组保存为文件的最有效方法【英文标题】:Most efficient way to save large double arrays as files in C# 【发布时间】:2014-09-02 09:48:29 【问题描述】:

我正在编写一个程序,它将 .dat 文件中的数据读取到 double[,,] 数组中,计算一些东西,并且需要将数组写入文件以保存它们以供以后使用。

这些数组最多可以有 [64x64x150000] 个元素,这迫使我已经将这些文件分成小部分加载到程序中以使用它们(否则会调用 MemoryException)。到目前为止,我使用文本文件将较小的数组保存在我的硬盘上,但是逐步保存 [64x64x150000] 数组最后会填满每个文件超过 6GB 的空间,当您必须使用大量这些 .dat- 时,这很安静文件,并且几乎可以保留所有 .txt 文件。

所以我想知道是否有任何其他文件类型可以节省一些硬盘空间,或者是否有另一种可能性将这些数组保存在我的程序之外以供以后使用,而对硬盘空间的要求更少。

(我需要能够在不同计算机之间交换文件)。

【问题讨论】:

最低限度您可以压缩文本文件。 多少位数(平均)?二进制每个'double' 8 个字节,但"1.1," 占用的空间更少。 float 是 4 字节二进制。 你是如何保存它们的?直接使用结构格式的二进制文件,还是使用 Xml 之类的高级格式?如果您使用 100% 二进制直接在 8 个字节上堆叠 8 个字节而没有绒毛,那么它应该是 4,915,200,000 字节。您可以将其更改为使用单个吗?这会将大小减少一半,因为单是 4 字节浮点数,而双精度是 8 字节浮点数。它还需要浮动吗?例如你可以使用一个 4 字节的整数吗? 另外,这真的取决于你的双数组代表什么样的数据。是否都是同一类型的数据。可以识别值中的冗余并使用数字表来大幅减少磁盘空间。例如。您将更大的整数存储在一起,并让条目引用它们的索引(文件中的偏移量)。 为什么不直接使用 BinarySerializer 直接序列化数组呢? ypu 真的需要双打而不是浮动等 【参考方案1】:

(8 B/双倍 * (64 * 64 * 150000) 双倍) / (109 B/GB) = 5.6 GB

因此,除非您降低到较低的精度(浮点数)或执行某种压缩,否则您将需要 5.6 GB 来存储所有这些双精度。每个文件减少到浮点数需要 2.8 GB。

对于长度为 150000 的 64 * 64 向量中的每一个,您可能能够执行信号压缩(取决于数据的样子)。这是一个广泛的话题,所以在不了解更多信息的情况下,我只能为您提供一个起点:Signal compression。

【讨论】:

【参考方案2】:

压缩或尝试Binary Serialization。 double 可以占用文本中的几十个字节,尤其取决于您的编码(每个数字 1-2)。在二进制中,每个字节正好是 8 个字节(+ 不管记账开销多少,可能是最小的)。

【讨论】:

以上是关于在 C# 中将大型双数组保存为文件的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 C#,将包含二进制数据的字符串转换为字节数组的最有效方法是啥

在 Powershell 中,按记录类型拆分大型文本文件的最有效方法是啥?

在 Pandas 中将字典转换为对称/距离矩阵的最有效方法

在NodeJS中将许多文件中的JSON对象插入MongoDB的最有效方法

Java 中将位打包到 byte[] 并读回的最有效方法是啥?

在 C# 中有效地缩小二维数组