[Java數據處理]4GB文本文件處理一例
- 2020 年 2 月 18 日
- 筆記
問題模型:
4GB文本文件in.triple每行包含兩個頂點,一個邊 : node1String, edgeString,node2String。輸出node.csv文件:node1Id,edgeString,node2Id。
in.triple的文件格式
<http://wikidata.dbpedia.org/resource/Q20> <http://dbpedia.org/ontology/description> "land i Nord-Europa"@nb . <http://wikidata.dbpedia.org/resource/Q20> <http://dbpedia.org/ontology/description> "land i Nord-Europa"@nn . <http://wikidata.dbpedia.org/resource/Q20> <http://dbpedia.org/ontology/description> "valtio Pohjois-Euroopassa"@fi . <http://wikidata.dbpedia.org/resource/Q20> <http://dbpedia.org/ontology/description> "pagilian idiay Amianan nga Europa"@tl . <http://wikidata.dbpedia.org/resource/Q20> <http://dbpedia.org/ontology/description> "civitas Europae"@la .
<http://wikidata.dbpedia.org/resource/Q20> <http://dbpedia.org/ontology/description> "ஐரோப்பிய நாடு"@ta .
<http://wikidata.dbpedia.org/resource/Q20> <http://dbpedia.org/ontology/description> "کشوری در اروپا"@fa . <http://wikidata.dbpedia.org/resource/Q20> <http://dbpedia.org/ontology/description> "სახელმწიფო ჩრდილოეთ ევროპაში, სკანდინავიის ნახევარკუნძულზე"@ka . <http://wikidata.dbpedia.org/resource/Q17> <http://dbpedia.org/ontology/description> "land i Øst-Asia"@nb . <http://wikidata.dbpedia.org/resource/Q17> <http://dbpedia.org/ontology/description> "valtio Aasiassa"@fi . <http://wikidata.dbpedia.org/resource/Q17> <http://dbpedia.org/ontology/description> "isla a pagilian idiay Daya nga Asia"@tl . <http://wikidata.dbpedia.org/resource/Q17> <http://dbpedia.org/ontology/description> "מדינה"@he . <http://wikidata.dbpedia.org/resource/Q17> <http://dbpedia.org/ontology/description> "கிழக்காசிய நாடு"@ta . <http://wikidata.dbpedia.org/resource/Q17> <http://dbpedia.org/ontology/description> "valsts austrumu Āzijā"@lv . <http://wikidata.dbpedia.org/resource/Q17> <http://dbpedia.org/ontology/description> "østasiatisk østat"@da . <http://wikidata.dbpedia.org/resource/Q17> <http://dbpedia.org/ontology/description> "کشوری در جنوب خاوری آسیا"@fa . <http://wikidata.dbpedia.org/resource/Q17> <http://dbpedia.org/ontology/description> "quốc đảo ở Đông Á"@vi . <http://wikidata.dbpedia.org/resource/Q17> <http://dbpedia.org/ontology/description> "জাপান এচিয়া মহাদেশত স্হিত এখন দেশ৷জাপান চাৰিটা ডাঙৰ আৰ্ৱো ানেক সৰ্ দ্বীপৰ সমস্টী৷"@as . <http://wikidata.dbpedia.org/resource/Q18> <http://dbpedia.org/ontology/description> "kontinent"@nb . <http://wikidata.dbpedia.org/resource/Q18> <http://dbpedia.org/ontology/description> "maanosa"@fi . <http://wikidata.dbpedia.org/resource/Q18> <http://dbpedia.org/ontology/description> "kontinente"@tl . <http://wikidata.dbpedia.org/resource/Q18> <http://dbpedia.org/ontology/description> "கண்டம்"@ta .
node.csv文件格式
1,<http://wikidata.dbpedia.org/resource/Q20> 2,<http://dbpedia.org/ontology/description> 3,<http://wikidata.dbpedia.org/resource/Q17> 4,<http://wikidata.dbpedia.org/resource/Q18> 5,<http://wikidata.dbpedia.org/resource/Q15> 6,<http://wikidata.dbpedia.org/resource/Q26> 7,<http://wikidata.dbpedia.org/resource/Q21> 8,<http://wikidata.dbpedia.org/resource/Q22> 9,<http://wikidata.dbpedia.org/resource/Q27>
edge.csv格式
1,2,"land 1,2,"land 1,2,"valtio 1,2,"pagilian 1,2,"civitas 1,2,"ஐரோப்பிய 1,2,"land 1,2,"کشوری 1,2,"სახელმწიფო 3,2,"land 3,2,"valtio 3,2,"isla 3,2,"מדינה"@he 3,2,"கிழக்காசிய 3,2,"valsts 3,2,"østasiatisk 3,2,"کشوری 3,2,"quốc 3,2,"জাপান 4,2,"kontinent"@nb 4,2,"maanosa"@fi
初始演算法
隨機按行讀in.triple,對每個nodeString去hash表查,獲取或生成ID後把相關數據順序追加寫入node.csv和edge.csv.
資源監控
因為是按行處理,所以監控下來記憶體使用150M不到。
堆記憶體監控,第一小時使用150M左右, 第11小時使用500M,peak memory usage 1GB。(資源利用率低)
耗時估算
原始數據4個G,估算輸出數據5個G,前10個小時輸出了約300M數據, 按48小時處理1.5G數據算,約3天可以處理完。
演算法優化1
利用記憶體直接存儲中間結果,最後一次性寫磁碟。
初始演算法中有三個對象:(1)存儲頂點ID的HashTable; (2) nodes.csv; (3) edges.csv。本來是每處理一行就寫一次輸出文件,現在將nodes.csv和 edges.csv的結果分別存在兩個字元串中最後一次性寫磁碟。String最大大小與java虛擬機有關。
演算法優化2
利用多執行緒提高記憶體和CPU利用率。
文件拷貝一份,供兩個執行緒處理; 一個執行緒Thread1負責處理頂點,生成頂點ID;兩個執行緒共享一個ConcurrentHashMap(執行緒安全),和兩個計數器count1(執行緒1處理的行數)和count2(執行緒二處理的行數);一個執行緒Thread2負責生成 node1ID,node2ID, edgeString。
必須保證count2始終小於count1