我有一個非常大的文本文件,大約43GB,我用它來處理它們以生成其他形式的文件。我不想安裝任何數據庫或任何索引搜索引擎爲了快速訪問,逐行掃描大文本文件的索引
數據在.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> .
目標是生成所有三元組的所有組合誰分享同一主題:
例如用於受試者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是45GB文本文件的行數,不用說這需要幾年才能完成。
了我認爲的優化:
加載一個HashMap [字符串,IntArray]外觀每個鍵和使用任何庫由行號訪問該文件,例如轉位線:
Q1000 | 1,2,433
Q1001 | 2334,323,2124
缺點是索引可能是比較大的還有,考慮到我們將有具體的行號訪問另一個指標,再加上超載我沒有嘗試
的性能- 做一個文本文件,對所有三元像
Q1000.txt
每個鍵包含目標Q1000
並超過他們迭代一個接一個,使組合
缺點:這似乎是最快和最少的內存消耗,但肯定會創建大約1000萬個文件並訪問它們將是一個問題,是否有替代方案?
我使用scala
腳本任務
可能有一個不使用數據庫的原因,但實際上你要*實施*一個。在[context](http://stackoverflow.com/q/17739973/2390083) – Beryllium