问题模型:
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.