約 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 のテキスト ファイルの行数です。言うまでもなく、そうするには何年もかかります。
私が最適化するために考えたこと:
HashMap [String,IntArray] をロードして、各キーの出現行にインデックスを付け、任意のライブラリを使用して行番号でファイルにアクセスします。次に例を示します。
Q1000 | 1,2,433
Q1001 | 2334,323,2124
欠点は、インデックスが比較的大きくなる可能性があることです.
Q1000.txt
すべてのトリプルのように各キーのテキスト ファイルを作成し、サブジェクトQ1000
を含め、それらを 1 つずつ反復して組み合わせを作成します。
欠点: これは最も高速でメモリ消費が少ないようですが、確かに約 1,000 万個のファイルを作成し、それらにアクセスすることは問題になります。
scala
タスクにスクリプトを使用しています