C# 将大数组序列化到磁盘

标签 c# serialization large-files

我有一个非常大的图形存储在一维数组(大约 1.1 GB)中,我可以将其存储在我的机器上的内存中,该机器运行 Windows XP,具有 2GB 内存和 2GB 虚拟内存。我能够在内存中生成整个数据集,但是当我尝试使用 BinaryFormatter 将其序列化到磁盘时,文件大小达到大约 50MB,然后出现内存不足异常。我用来编写此代码的代码与我在所有较小问题中使用的代码相同:

StateInformation[] diskReady = GenerateStateGraph();
BinaryFormatter bf = new BinaryFormatter();
using (Stream file = File.OpenWrite(@"C:\temp\states.dat"))
{
    bf.Serialize(file, diskReady);
}

搜索算法非常轻量级,一旦它在内存中,我就可以毫无问题地对该图执行搜索。

我真的有 3 个问题:

  1. 有没有更靠谱的方法 将大数据集写入磁盘。我 猜猜你可以定义 large as when 数据集的大小方法 可用内存量, 虽然我不确定有多准确 就是这样。

  2. 我应该移动到更多数据库吗 以中心方法?

  3. 谁能告诉我一些 关于阅读部分的文献 磁盘文件中的大数据集 C#?

最佳答案

自己写条目归档。一个简单的解决方案如下:

StateInformation[] diskReady = GenerateStateGraph();
BinaryFormatter bf = new BinaryFormatter();
using (Stream file = File.OpenWrite(@"C:\temp\states.dat"))
{
  foreach(StateInformation si in diskReady)
    using(MemoryStream ms = new MemoryStream())
    {
      bf.Serialize(ms, diskReady);
      byte[] ser = ms.ToArray();
      int len = ser.Length;
      file.WriteByte((byte) len & 0x000000FF);
      file.WriteByte((byte) (len & 0x0000FF00) >> 8);
      file.WriteByte((byte) (len & 0x00FF0000) >> 16);
      file.WriteByte((byte) (len & 0x7F000000) >> 24);
      file.Write(ser, 0, len);
    }
}

一次只需要单个 StateInformation 对象的内存,要反序列化,您需要读取四个字节,构造长度,创建该大小的缓冲区,填充它,然后反序列化。

如果您创建更专业的格式,以上所有内容都可以针对速度、内存使用和磁盘大小进行认真优化,但以上只是说明了原理。

关于C# 将大数组序列化到磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3863793/

相关文章:

c# - 异常抛出 : encapsulate them or not?

c# - 如何使用 C# 在 Windows 上读取连接的 iOS 设备的 UDID?

c# - 获取给定 ID 列表中每个 ID 的最新更新记录。 LINQ

.net - 如何在 JsonConverter 中将数组转换为对象

PHP fwrite() 用于将大字符串写入文件

xml - 从 XML 文件随机采样到 R 中的数据帧

c# - 如何读取外部应用程序 DrawText 绘制的文本

mysql - PCRE Regex - 替换序列化字符串中的 URL

c# - 有没有人使用 Hessian 二进制远程协议(protocol)来桥接使用 Java 和 .NET 的应用程序?

javascript - Javascript 中的大型 blob 文件