2010-04-08 149 views
2

我想读取和写入大的原始卷文件(例如MRI扫描)的内容。这些文件只是一系列例如32 x 32 x 32浮点,因此它们很好地映射到1D阵列。我希望能够将二进制卷文件的内容读入例如一维数组中。浮动或ushort(取决于二进制文件的数据类型),并将数组导出回原始卷文件。在C#中读取/写入数组内容到二进制文件的最佳方式是什么?

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

编辑:看来这是不可能的> 2GB阵列工作,但问题仍然主张小阵列(大约256 MB左右)

回答

3

你不会得到阵列,超过2GB的数据更。从我记忆中,每个对象的CLR限制为1GB。这是可能已被提升为.NET 4在64位,但我没有听说过它。

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

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

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

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

+3

如果他使用破碎的数组而不是纯粹的多维数组,他将不会遇到每个对象的限制。 – 2010-04-08 14:40:33

+0

好吧,也许2 GB是不可行的,但我仍然希望以最好的方式读取和写入大量数据。我已经更新了相应的问题。 – Eric 2010-04-08 14:48:57

相关问题