3

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

ファイルは非常に大きなテキスト ファイルで、何百万ものレコードを保持し、それぞれのサイズは 250 MB を超えています (そのうちの 1 つが実際には 7 GB です!!)。250 MB のファイルをアプリケーションにロードしようとすると、処理中に約 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 が必要になるため、ライブラリによってはメモリ内の最大で 200 万から 300 万のトリプルで作業できます。利用可能な RAM。関連するポイントとして、現在のリリースの SPARQL アルゴリズムはその規模ではひどいので、データをメモリにロードできたとしても、それを効果的にクエリすることはできません。

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

ただし、dotNetRDF はすぐに使用できるさまざまなネイティブ トリプル ストアをサポートしているため ( IQueryableGenericIOManagerインターフェイスとその実装を参照)、そのストアのネイティブ ロード メカニズムを使用して DBPedia ダンプを適切なストアにロードする必要があります (これは、dotNetRDF 経由でロードするよりも高速です)。 )、次に dotNetRDF を単純にクライアントとして使用して、クエリを実行します

于 2012-02-13T20:26:10.747 に答える