2

約 43 GB の非常に大きなテキスト ファイルがあり、それらを処理して別の形式の別のファイルを生成するために使用します。データベースやインデックス検索エンジンをセットアップしたくありません

データは .ttl 形式です

<http://www.wikidata.org/entity/Q1000> <http://www.w3.org/2002/07/owl#sameAs> <http://nl.dbpedia.org/resource/Gabon> .
<http://www.wikidata.org/entity/Q1000> <http://www.w3.org/2002/07/owl#sameAs> <http://en.dbpedia.org/resource/Gabon> .
<http://www.wikidata.org/entity/Q1001> <http://www.w3.org/2002/07/owl#sameAs> <http://lad.dbpedia.org/resource/Mohandas_Gandhi> .
<http://www.wikidata.org/entity/Q1001> <http://www.w3.org/2002/07/owl#sameAs> <http://lb.dbpedia.org/resource/Mohandas_Karamchand_Gandhi> .

target は、同じ主語を共有するすべてのトリプルからすべての組み合わせを生成します。

たとえば、件名 Q1000 の場合:

<http://nl.dbpedia.org/resource/Gabon> <http://www.w3.org/2002/07/owl#sameAs> <http://en.dbpedia.org/resource/Gabon> .
<http://en.dbpedia.org/resource/Gabon> <http://www.w3.org/2002/07/owl#sameAs> <http://nl.dbpedia.org/resource/Gabon> .

問題: 最初のダミー コードは複雑さ O(n^2) で繰り返し処理されます。ここで、n は 45 GB のテキスト ファイルの行数です。言うまでもなく、そうするには何年もかかります。

私が最適化するために考えたこと:

  1. HashMap [String,IntArray] をロードして、各キーの出現行にインデックスを付け、任意のライブラリを使用して行番号でファイルにアクセスします。次に例を示します。

    Q1000 | 1,2,433
    Q1001 | 2334,323,2124

欠点は、インデックスが比較的大きくなる可能性があることです.

  1. Q1000.txtすべてのトリプルのように各キーのテキスト ファイルを作成し、サブジェクトQ1000を含め、それらを 1 つずつ反復して組み合わせを作成します。

欠点: これは最も高速でメモリ消費が少ないようですが、確かに約 1,000 万個のファイルを作成し、それらにアクセスすることは問題になります。

scalaタスクにスクリプトを使用しています

4

2 に答える 2

1

考えられる解決策は、既存のmap-reduceライブラリを使用することです。結局のところ、あなたのタスクはまさに​​ map-reduce の目的です。複数のマシンで計算を並列化しない場合でも、主な利点は、分割とマージの管理を処理することです。

Scala APIを使用した興味深いライブラリApache Crunchがあります。私自身は使用していませんが、問題をうまく解決できるようです。あなたの行は、主題に従って分割され、次に

于 2013-07-19T07:26:30.773 に答える