[Java数据处理]4GB文本文件处理一例

问题模型:

        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.

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值