【问题标题】:Fastest (loads and saves) way to store large 2D array存储大型二维数组的最快(加载和保存)方式
【发布时间】:2013-06-16 12:02:58
【问题描述】:

我有一个 2,000 x 2,000 的二维对象数组:

 public class Plants
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int Health { get; set; }

}

我正在寻求建议,以最快的速度(用于写入和读取)一次吞下整个文件?也就是说,我永远不需要寻找这个文件并从特定位置读/写。

有什么想法吗?


感谢您的反馈! 我最终使用了 binarywriter。文件大小约为 55MB,保存/加载速度非常快(约几秒)。

【问题讨论】:

  • 你不能使用数据库?您需要什么类型的文件?
  • 在您发布Zombies 类的代码之前,我无法回答这个问题。
  • 我倾向于使用BinaryWriter 来编写它,并使用BinaryReader 来读回它。如果这样做,您可以通过在打开流时指定更大的缓冲区(建议 64K)来稍微提高性能。
  • 很好奇为什么评论者认为需要另一个对象。你可以有一个int 的二维数组,对吧?为什么不是Plant 的二维数组?
  • 我赞同 Jim 对 BinaryWriter 的建议。

标签: c# file-io io


【解决方案1】:

像这样回答“最快”的问题真的很难。问题是您的每个硬盘驱动器、cpu、内存大小、内存速度、主板等都可能与我的不同。然后,文件大小和数据形状也很重要。

在具有非常快的磁盘和平均或慢速 CPU 的系统上加载未压缩的文件可以更好地处理大文件。在具有快速 CPU 和平均到慢速磁盘驱动器的系统上,解压缩文件可能效果更好。现在,综合考虑内存使用和访问速度。

处理完所有这些潜在影响后,您还需要处理软件中数据使用的环境。你可以加载一次并重复使用它吗?那么你就不需要像你想象的那样关心加载速度了。或者您是否需要非常频繁地阅读和编写它,只需要在这里和那里进行一些小改动?那么你应该考虑随机访问存储或使用数据库。

既然您已经了解了所有这些问题(还有更多问题),您可能会想,“所有这些努力都值得吗?”如果您是这样想的,那么您来对地方了。

不要预先优化。选择可以很好工作的东西(不一定是绝对最好的),然后在需要帮助时进行优化。

【讨论】:

  • 非常好的建议。是的,这是一次阅读,再也不会打扰它。
【解决方案2】:

最快的方法是您手动读取/写入字节到流中,并且还写入了 Name 的长度,以便可以对其进行反序列化。

Protobuf-Net(具有易于定义接口的二进制协议)或 Json.Net + Zip 几乎一样快(而且更容易)。可以调整 Protobuf 以写入长度标头,以防在处理植物时需要流式传输它们。

还应该考虑 GZipStream 或 DeflateStream,因为它可能会在一次从磁盘访问这么多数据时提供好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 2011-07-12
    • 2014-05-02
    • 2020-09-10
    • 2015-07-31
    • 2020-12-04
    • 2017-01-26
    • 1970-01-01
    相关资源
    最近更新 更多