我有一个非常大的图形存储在一维数组(大约 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 个问题:
有没有更靠谱的方法 将大数据集写入磁盘。我 猜猜你可以定义 large as when 数据集的大小方法 可用内存量, 虽然我不确定有多准确 就是这样。
我应该移动到更多数据库吗 以中心方法?
谁能告诉我一些 关于阅读部分的文献 磁盘文件中的大数据集 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/