4GB文本文件in.triple每行包含两个顶点,一个边 : node1String, edgeString,node2String。输出node.csv文件:node1Id,edgeString,node2Id。
<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 .
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>
1,2,"land1,2,"land1,2,"valtio1,2,"pagilian1,2,"civitas1,2,"ஐரோப்பிய1,2,"land1,2,"کشوری1,2,"სახელმწიფო3,2,"land3,2,"valtio3,2,"isla3,2,"מדינה"@he3,2,"கிழக்காசிய3,2,"valsts3,2,"østasiatisk3,2,"کشوری3,2,"quốc3,2,"জাপান4,2,"kontinent"@nb4,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)存储顶点ID的HashTable; (2) nodes.csv; (3) edges.csv。本来是每处理一行就写一次输出文件,现在将nodes.csv和 edges.csv的结果分别存在两个字符串中最后一次性写磁盘。String最大大小与java虚拟机有关。
利用多线程提高内存和CPU利用率。
文件拷贝一份,供两个线程处理; 一个线程Thread1负责处理顶点,生成顶点ID;两个线程共享一个ConcurrentHashMap(线程安全),和两个计数器count1(线程1处理的行数)和count2(线程二处理的行数);一个线程Thread2负责生成 node1ID,node2ID, edgeString。
必须保证count2始终小于count1.