2012-02-13 15 views
3

dbpediaデータの大量のダンプをC#アプリケーションにロードしようとしていますが、ロードするたびにメモリが不足します。巨大なDBpediaダンプをロード中に例外が発生しました

ファイルは非常に大きなテキストファイルで、何百万ものレコードが保存されており、そのサイズは250MBを超えています(そのうちの1つは実際には7GB!)、250MBのファイルをアプリケーションにロードしようとすると、約10秒間、私のRAM(6GB、最初は2GB使用)が約5GBに増加し、プログラムはメモリ不足の例外をスローします。

私は、メモリ不足の例外はすべてメモリの空の隣接チャンクに関するものだと理解しました。プログラムにそのようなファイルをロードする方法を知りたいのですが?

私はファイルを読み込むためにコードを使用していますが、私はdotNetRDFライブラリを使用しています。

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

250MBのファイルは3GBを占有しません。どのようにファイルをロードしていますか? – Blorgbeard

+0

私は、ファイルからトリプルストアをロードするdotNetRDFというライブラリを使用しています。トリプルストアクラスには、loadFromFile()という関数があります。 http://bit.ly/yqPpJB – SKandeel

+0

ロードに関係しない方法が見つからない場合最初のデータベース全体、あなたはより多くのスワップを追加しようとすることができます。 –

答えて

1

dotNetRDFは、メモリ内にこの量のデータを処理するようには設計されていません。すべてのデータ解析はストリーミングですが、すべてのメモリを占有し、OOM例外につながるデータを格納するインメモリ構造を構築する必要があります。

デフォルトでは、トリプルは完全に索引付けされているため、SPARQLを使用して効率的に問合せを行い、トリプルあたり約1.7kbを必要とする現行リリースのライブラリーでは大部分は2-300万トリプル使用可能なRAMに応じてメモリに格納されます。関連する点として、現在のリリースのSPARQLアルゴリズムはその規模ではひどいので、たとえデータをメモリに読み込むことができても、それを効果的に照会することはできません。

ライブラリの次回リリースでは、メモリ使用量が削減され、SPARQLのパフォーマンスが大幅に向上しましたが、そのデータ量では設計されていませんでした。

しかし、dotNetRDFは広範囲のネイティブトリプルストアをそのまま使用できます(IQueryableGenericIOManagerインターフェイスとその実装を参照)ので、DBPediaダンプを適切なストアにロードする必要があります。 dotNetRDF経由でロードするよりも)、そして単にあなたのクエリを作るためのクライアントとしてdotNetRDFを使用してください。

関連する問題