java如何高效处理文件操作?

xingweiboy 2010-07-20 09:27:07
现在遇到个java操作文件的问题,但是自己的解决方式效率不是很高,拿出来看看大家有没有好的处理方法。
现在我有两个文件,文件A,结构是"ID\tSOME_VALUE_1",还有个文件B,结构是"ID\tSOME_VALUE_2\TSOME_VALUE_3...\tSOME_VALUE_N"。简单说,文件A每行有两个值,一个ID,一个SOME_VALUE_1。文件B每行有多个值,ID,以及其他字段值,所有值都是int。
现在文件A和文件B的行数都是亿级的。想要把A和B都拼接成一个文件,含有文件A和文件B的所有字段。
我的处理是进行文件分割,按照一定的记录数,比如5千万记录为一个文件,分别切割成多个文件,然后每次取一块A文件和一块B文件进行拼接,得到最终文件。可是感觉效率不是很高,全部处理需要一个小时左右。
不知道大家有什么想法。不要说导入数据库,做表连接,那样效率很低。
...全文
231 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingweiboy 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cooljia 的回复:]

楼主没有介绍你的文件中的ID是否已经排序了啊

我一拍脑袋想出两种方案:
1. 如果你这是特殊情况特别处理,处理完这两个文件就没这个事情了,我个人感觉还是还是将数据导入数据库,做个outer join就ok
2. 如果经常会出现这样的文件,可以考虑按照文件ID范畴分割成多个文件,比如第一个文件叫tsv_01,文件内按照ID 1-20w以内写入到编号tsv_01_001的文件内,第20万零……
[/Quote]

首先方案一,这个绝对没戏,我试过了,效率低的吓人。因为数据量太大了。
对于方案二,可以说我后来想到了就是采用多线程,不过因为都是IO操作,所以速度决定于服务器硬盘的读写速度,我主观认为多线程可能意义不大,所以没有测试。一会儿做个测试看看....
xingweiboy 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dr_lou 的回复:]

两个文件每一行的ID都可以对应上么?
[/Quote]

当然不可以,要是可以的话,处理就简单了。而且ID是无序的。
xingweiboy 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bao110908 的回复:]

引用楼主 xingweiboy 的回复:
现在文件A和文件B的行数都是亿级的。想要把A和B都拼接成一个文件,含有文件A和文件B的所有字段。


按照 ID 来拼?
[/Quote]
对,就是按照ID进行拼接
cooljia 2010-07-20
  • 打赏
  • 举报
回复
楼主没有介绍你的文件中的ID是否已经排序了啊

我一拍脑袋想出两种方案:
1. 如果你这是特殊情况特别处理,处理完这两个文件就没这个事情了,我个人感觉还是还是将数据导入数据库,做个outer join就ok
2. 如果经常会出现这样的文件,可以考虑按照文件ID范畴分割成多个文件,比如第一个文件叫tsv_01,文件内按照ID 1-20w以内写入到编号tsv_01_001的文件内,第20万零一条到40万写入到tsv_01_002文件内。。。文件分割完毕以后,采用多线程,
第一个线程对对tsv_01_001, tsv_02_001文件进行合并处理
第二个线程对对tsv_01_002, tsv_02_002文件进行合并处理
以此类推。。
  • 打赏
  • 举报
回复
[Quote=引用楼主 xingweiboy 的回复:]
现在文件A和文件B的行数都是亿级的。想要把A和B都拼接成一个文件,含有文件A和文件B的所有字段。
[/Quote]

按照 ID 来拼?
dr_lou 2010-07-20
  • 打赏
  • 举报
回复
两个文件每一行的ID都可以对应上么?
龙四 2010-07-20
  • 打赏
  • 举报
回复
可以试试NIO了
blueram 2010-07-20
  • 打赏
  • 举报
回复
向2楼说的用字符流吧,前些天写json与对象的转换操作,看了几种框架,效率最高的org.codehaus.jackson
就是以流的方式进行的
closewbq 2010-07-20
  • 打赏
  • 举报
回复
确实也没有好的办法,因为你要进行拼接么。必须是以行为单位取的。这样就限定死了。
smileflyer 2010-07-20
  • 打赏
  • 举报
回复
没办法,java你一行一行的处理吧。
lizhongyi188 2010-07-20
  • 打赏
  • 举报
回复
楼上说的有道理,导入数据库肯定是不行的

读的的话 加上缓冲区效率会高些,采用字符流来读取,可能要高些,自认为的,但也不是很确定,因为字符流一次性可以多个字节!

lynch2008 2010-07-20
  • 打赏
  • 举报
回复
导入数据库肯定是不行的,会更加的慢。

对输入的文件以只读方式,对输出的文件以append方式,试试会不会快点。

log4j写文件好象就是以append方式写入的。

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧