2

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

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

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

4

1 回答 1

3

你不会得到超过 2GB 数据的数组。据我记得,每个对象的 CLR 限制为 1GB。在 64 位上的 .NET 4 可能已经取消,但我还没有听说过

编辑:根据这篇文章,限制是 2GB,而不是 1GB - 但你仍然不会管理超过 2GB。

您真的必须一次将所有数据都保存在内存中吗?你可以一次处理它的一部分吗?

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

你有多确信你在这方面的代码中确实存在性能问题?值得做最简单的事情,然后对其进行分析,首先...

于 2010-04-08T14:36:11.560 回答