加载巨大的DBpedia转储时出现内存不足

时间:2012-02-13 13:31:41

标签: c# .net out-of-memory dbpedia dotnetrdf

我正在尝试将大量的dbpedia数据转储到我的C#应用​​程序中,每次尝试加载它时都会出现内存损坏。

这些文件是非常大的文本文件,拥有数百万条记录,每条记录的大小超过250MB(其中一个实际上是7GB !!),当我尝试将250MB文件加载到我的应用程序时,它等待大约10秒钟,我的RAM(6GB,最初使用@ 2GB)增加到大约5GB,然后程序抛出内存不足异常。

我明白内存不足异常是关于空的相邻内存块,我想知道如何管理将这样的文件加载到我的程序中?

以下是我用来加载文件的代码,我正在使用dotNetRDF库。

TripleStore temp = new TripleStore();
//adding Uris to the store
temp.LoadFromFile(@"C:\MyTripleStore\pnd_en.nt");

1 个答案:

答案 0 :(得分:1)

dotNetRDF根本不是设计用于处理内存中的大量数据。它的所有数据解析都是流式传输,但你必须构建内存结构来存储数据,这会占用所有内存并导致OOM异常。

默认情况下,三元组是完全索引的,所以它们可以使用SPARQL进行高效查询,并且库的当前版本每个Triple需要大约1.7kb,所以最多这个库可以让你在2-3万个三元组中工作内存取决于您可用的RAM。作为一个相关的点,当前版本中的SPARQL算法在这种规模上非常糟糕,所以即使你可以将数据加载到内存中,你也无法有效地查询它。

虽然该库的下一个版本确实减少了内存使用量并大大提高了SPARQL性能,但它仍未设计用于该数据量。

然而,dotNetRDF支持开箱即用的各种原生三重存储(请参阅IQueryableGenericIOManager接口及其实现),因此您应该使用存储本机加载机制将DBPedia转储加载到适当的存储中(将比通过dotNetRDF加载更快,然后使用dotNetRDF作为客户端进行查询