什么';在C#中,从二进制文件读/写数组内容的最佳方式是什么?

什么';在C#中,从二进制文件读/写数组内容的最佳方式是什么?,c#,binaryfiles,io,C#,Binaryfiles,Io,我想读写大型原始卷文件的内容(例如MRI扫描)。这些文件只是一个序列,例如32 x 32 x 32浮点,因此它们可以很好地映射到1D数组。我希望能够将二进制卷文件的内容读入1D数组,例如float或ushort(取决于二进制文件的数据类型),并类似地将数组导出回原始卷文件 用C#做这件事最好的方法是什么?使用BinaryReader/BinaryWriter一次读取/写入1个元素?使用FileStream将它们逐段读取到字节数组中。读取,然后在数组之间执行System.Buffer.BlockC

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

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


编辑:似乎不可能使用大于2GB的阵列,但问题仍然是较小的阵列(大约256MB)

您无法获得数据超过2GB的阵列。据我所知,每个对象的CLR限制为1GB。对于64位的.NET4来说,这可能已经取消了,但我还没有听说过

编辑:根据限制是2GB,而不是1GB-但您仍然无法管理超过2GB的数据

您真的必须一次将所有数据存储在内存中吗?你能一次处理一大块吗

编辑:好的,现在只需要将文件读入浮点数组?读取块(使用
BinaryReader.read(byte[],int,int)
BinaryReader.ReadBytes(int)
)然后使用
Buffer.BlockCopy
有效地将字节转换为浮点等,这可能是最简单的方法。不过,请注意,这将是endian敏感的。如果您想更可靠地转换(以便以后可以更改endianness,或在big endian平台上运行),您可能需要反复调用
ReadFloat()


您是否确信在这方面的代码实际上存在性能问题?值得做最简单的工作,然后对其进行分析,首先…

如果他使用不规则数组而不是纯粹的多维数组,他将不会遇到每对象的限制。好吧,也许2GB不可行,但我仍然希望以最好的方式读写更大的数据数组。我已经相应地更新了这个问题。