3

我正在使用大型多维字节数组(每个数组约 500mb,例如尺寸为 [8,8192,8192] 的数组),我想将它们读取并写入文件以进行存储。

我尝试使用 BinaryFormatter 但速度很慢(需要几分钟才能完成)。

我尝试使用 BinaryWriter,但它只接受一维数组。现在,在 C 中,将多维数组作为单维传递没有问题。在 C# 中,据我所知,我有两个选择:

  • 为一维数组分配另一块内存,使用 for 循环将数据复制到其中,然后使用 BinaryWriter 将此数组写入文件
  • 使用 for 循环,使用 BinaryWriter 将每个单独的字节写入文件

显然,如果我只是在任何地方使用 byte[] 而不是使用 myarray[i,j] 使用 myarray[i+j*myarray_width] 会更快,但这需要重写整个类,只是为了更容易工作一组 I/O 功能(保存/加载)。

一定有更好的办法。

4

1 回答 1

0

当涉及到快速序列化时,不安全的代码可能会派上用场。这里有两种技术可以提供帮助:

  1. 做一个 memcpy 从你的到一个你可以传递给byte[,]的新鲜事物。当然,这需要临时翻倍的存储空间和一些复制。不过,您可以将这项工作分成 64KB 的块。byte[]FileStream.Write
  2. PInvoke 到非托管WriteFile并将FileStream.SafeHandle值传递给它。WriteFile接受任意指针,因此您可以直接写出您的byte[,](转换为 a void*)。

选项 2 最快(“零拷贝”)。

旁注:当您需要重新解释字节时,不安全代码会派上用场。这种能力导致了 C 中的一些很好的抽象。幸运的是,C# 也有这种能力。

于 2012-12-13T09:20:45.223 回答