gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:20:58 25 4
gpt4 key购买 nike

我有一个非常大的图形存储在一维数组(大约 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com