在C#中从/向二进制文件读取/写入数组内容的最佳方法是什么?

时间:2010-04-08 14:31:50

标签: c# binaryfiles io

我想读取和写入大型原始卷文件(例如MRI扫描)的内容。这些文件只是例如一系列文件。 32 x 32 x 32浮点数,因此它们可以很好地映射到1D数组。我希望能够将二进制卷文件的内容读入例如1D数组中。 float或ushort(取决于二进制文件的数据类型),同样将数组导出回原始卷文件。

使用C#执行此操作的最佳方法是什么?使用BinaryReader / BinaryWriter一次读/写1个元素?使用FileStream.Read将它们分段读入字节数组,然后在数组之间执行System.Buffer.BlockCopy?写我自己的读者/作家?

编辑:似乎无法使用> 2GB阵列,但问题仍然代表较小的阵列(约256 MB左右)

1 个答案:

答案 0 :(得分:3)

您不会获得超过2GB数据的数组。根据我的记忆,每个对象的CLR限制为1GB。它是可能在64位上被解除了.NET 4,但我还没有听说过。

编辑:根据this article,限制是2GB,而不是1GB - 但你仍然不会超过2GB。

你真的必须同时拥有内存中的所有数据吗?你能一次处理它的大块吗?

编辑:好的,现在只是从文件读取到浮点数组?读取块(使用BinaryReader.Read(byte[], int, int)BinaryReader.ReadBytes(int))然后使用Buffer.BlockCopy可以有效地从字节转换为浮点数等,这可能是最简单的。但请注意,这将是字节序敏感的。如果你想更强大地转换(以便以后可以改变字节顺序,或者在大端平台上运行),你可能想要反复调用ReadFloat()

您是否确信在这个代码区域中确实存在性能问题?值得做最简单的事情,然后分析它,开始......