3

我正在尝试将大量 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");
4

1 回答 1

1

dotNetRDF 根本不是为了处理其内存存储中的数据量而设计的。它的所有数据解析都是流式的,但是您必须构建内存结构来存储占用所有内存并导致 OOM 异常的数据。

默认情况下,三元组是完全索引的,因此可以使用 SPARQL 有效地查询它们,并且使用当前版本的库,每个三元组大约需要 1.7kb,因此该库最多可以让您在内存中处理 2-3 百万个三元组,具体取决于你可用的内存。与此相关的是,当前版本中的 SPARQL 算法在这种规模下非常糟糕,因此即使您可以将数据加载到内存中,您也无法有效地查询它。

尽管该库的下一个版本确实减少了内存使用并极大地提高了 SPARQL 性能,但它仍然从未为这种数据量而设计。

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

于 2012-02-13T20:26:10.747 回答