【问题标题】:Fast load/save multidimensional array快速加载/保存多维数组
【发布时间】:2013-07-12 21:23:04
【问题描述】:

我需要快速存储/加载可能较大的 ushort[,,]byte[,,]double[,,] 数组。

我尝试过简单的方法,简单地将数组元素逐个扫描到FileStream fs

for (p = 0; p < Planes; p++)
{
    for (y = 0; y < Height; y++)
    {
        for (x = 0; x < Width; x++)
        {
            fs.Write(BitConverter.GetBytes(array1[p, y, x]), 0, 8);
        }
    }
}

我用BinaryFormatter替换了这个循环,效果更好:

bf.Serialize(fs, array1);

我运行了一个小型基准测试,存储然后加载 3 x 1024 x 768 的双精度数组 10 次,结果如下:

简单方法:10 628 毫秒

BinaryFormatter 方法:8 722 毫秒

有没有更快的方法?使用指针?将数组序列化为一维然后刷新到文件?

感谢您的任何建议。

【问题讨论】:

  • 二进制格式化程序将是我能想到的最快的东西,但您需要提供更多代码来概述您在这些方面尝试过的内容,包括测试的元素数,因为我认为与遍历每个元素相比,将一个图序列化到文件会明显更快。
  • @StevePy 我实际上是在处理摄影图像,所以数组通常类似于ushort[3,1440,2160]BinaryFormatter 非常快,尽管我认为它与数据结构无关。这就是为什么我想知道是否有一种更快的方法来利用数组的已知格式(我只对存储元素感兴趣,格式和数组大小是事先知道的)。
  • 您的循环代码可能会被优化,但不会改变 I/O 时间。

标签: c# file serialization multidimensional-array


【解决方案1】:

MemoryStream写数据,然后copyTo你的FileStream

ms.copyTo(fs)

它将加快您使用硬盘驱动器的 IO 操作

【讨论】:

  • 序列化到 MemoryStream 然后将其复制到 FileStream 实际上比单独使用 FileStream 花费了两倍的时间。不过还是谢谢。
  • @Libor 是的,它可能看起来很奇怪,但它可以通过优化您的文件 IO 操作来真正加快速度,只是有第二个想法 - 使用 BinaryWriter 而不是 BitConverter.GetBytes
  • 感谢BinaryWriter 的建议。我实际上做了一个基准测试,BinaryFormatter+FileStream 方法仍然是最快的。添加 MemoryStream 会使其速度减慢两倍以上。
【解决方案2】:

好的,经过几次实验,BinaryFormatterFileStream 是我找到的最快的解决方案。

我已经测试了以下替代方案,但没有提高速度:

  • 写信给MemoryStream,然后复制到FileStream
  • FileStream 包裹在BufferedFileStream
  • 在幼稚循环中使用BinaryWriter 而不是BinaryFormatter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 2015-07-21
    • 2017-08-12
    • 2020-12-04
    • 1970-01-01
    • 2016-05-27
    • 2013-06-16
    相关资源
    最近更新 更多