要求用java实现读取超大文件

lptt 2009-07-21 06:23:26
要求实现读取超大文件(2G左右),并找到指定的字符串/
1.首先这么大的文件,怎么生成呢?
2.怎样读取呢?肯定会死机啊
3.语言或哪种环境好呢?

各位给支个招
...全文
1323 27 打赏 收藏 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveshuyingkongshi 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 gaoch_2000 的回复:]

java读写文件是调用本地方法来读写的,最终要用到windows的api。你为什么要把2g大的文件都存放到内存里,就在硬盘里放着,直接读取不就行了?建立一个索引会提高速度。
人家数据库文件有几十个G,频繁读取,也没有听说过内存不够用的
[/Quote]

人家昰分批讀的吧,這么大的文件如果不分批操作,肯定會掛吧!
syflyhua 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lovecj6185 的回复:]
引用楼主 lptt 的回复:
要求实现读取超大文件(2G左右),并找到指定的字符串/
1.首先这么大的文件,怎么生成呢?
2.怎样读取呢?肯定会死机啊
3.语言或哪种环境好呢?

各位给支个招


偶实现过5G左右文件的读取,没有出问题
1.用循环生成文件
你就用 PrintWriter类的println方法,一行行的写出来罗
循环个60万次,生成的txt文件都好几个G了
……
[/Quote]


楼主,你的程序是啥样子啊。不会是你给你的程序配了5G再来读吧。晕死。看你说的如此简单。
csgdseed 2009-07-22
  • 打赏
  • 举报
回复
边读边查找
yuwenbao 2009-07-22
  • 打赏
  • 举报
回复
唉。。。线程池啊,开启线程池,我的经验,根据配置不同,五到十个是没什么问题的
紫炎圣骑 2009-07-22
  • 打赏
  • 举报
回复
生成文件要多长时间?
lptt 2009-07-22
  • 打赏
  • 举报
回复
我试了一下 我的程序 搜索两个2G的文件(线程1对应第一个,线程2对应第二个)结果用时为85秒 平均分析一个是42秒左右 效率提高20%啊 开线程看来有些优化的 但估计多了就不行了
lovecj6185 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 yuwenbao 的回复:]
先用多线程来读取

采用用bufferedReader来读,不过注意,bufferedReader有个问题,就是readline方法遇到回车会挂起线程,所以要注意下

还要加快速度,就用nio来读吧,映射到内存中,几兆几兆地读就是了
[/Quote]

楼上是说用MappedByteBuffer类吧
不过偶没有用过,不知道效果如何

其实,还是不建议开线程的,因为线程本身就是十分耗资源的
在加上io,jvm会吃不消

偶主要是扩充heapsize,-Xmx1024m 就是把分配给jvm的内存设为1G
当然这要看你机器的性能了
如果2G的内存,还勉强可以这样设
flybird 2009-07-22
  • 打赏
  • 举报
回复
nio channel来读取
yuwenbao 2009-07-22
  • 打赏
  • 举报
回复
先用多线程来读取

采用用bufferedReader来读,不过注意,bufferedReader有个问题,就是readline方法遇到回车会挂起线程,所以要注意下

还要加快速度,就用nio来读吧,映射到内存中,几兆几兆地读就是了
lptt 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lovecj6185 的回复:]
引用 15 楼 lptt 的回复:
我实现了一个小demo 在一2G的文本中搜索指定字符串 用了55秒左右, 这个慢吗


不好说
要看你的系统配置
包括jvm的heapsize等
[/Quote]

兄台 程序还可以怎么优化 我和你的处理方法差不多
用多线程能好些吗
lptt 2009-07-22
  • 打赏
  • 举报
回复
en 差不多 我每次读10M 左右 估计程序的瓶颈就在于读硬盘的速度了吧
lovecj6185 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lptt 的回复:]
我实现了一个小demo 在一2G的文本中搜索指定字符串 用了55秒左右, 这个慢吗
[/Quote]

不好说
要看你的系统配置
包括jvm的heapsize等
紫炎圣骑 2009-07-22
  • 打赏
  • 举报
回复
是平均55秒吗?
lptt 2009-07-22
  • 打赏
  • 举报
回复
我实现了一个小demo 在一2G的文本中搜索指定字符串 用了55秒左右, 这个慢吗
gaoch_2000 2009-07-21
  • 打赏
  • 举报
回复
java读写文件是调用本地方法来读写的,最终要用到windows的api。你为什么要把2g大的文件都存放到内存里,就在硬盘里放着,直接读取不就行了?建立一个索引会提高速度。
人家数据库文件有几十个G,频繁读取,也没有听说过内存不够用的
Java2King 2009-07-21
  • 打赏
  • 举报
回复
用Lucene 建立索引,再查找
dingoc 2009-07-21
  • 打赏
  • 举报
回复
进来学习下到底怎么个读取法...
wusenet041 2009-07-21
  • 打赏
  • 举报
回复
这个应该很困难吧 即使做出来 不管是读取还是查找速度都相当慢
lovecj6185 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 lptt 的回复:]
要求实现读取超大文件(2G左右),并找到指定的字符串/
1.首先这么大的文件,怎么生成呢?
2.怎样读取呢?肯定会死机啊
3.语言或哪种环境好呢?

各位给支个招
[/Quote]

偶实现过5G左右文件的读取,没有出问题
1.用循环生成文件
你就用 PrintWriter类的println方法,一行行的写出来罗
循环个60万次,生成的txt文件都好几个G了

2.用BufferedReader类的readLine方法再一行行读出
偶当时是读到一个ArrayList里的,读一段,把这个ArrayList给清空一下
循环把文件读完,你可以边读边查找

3.语言和环境?
没太大区别吧,偶当时是java实现的
其他的语言也应该能够实现的
bolink5 2009-07-21
  • 打赏
  • 举报
回复
这个真的有点不现实啊。太难了啊
加载更多回复(7)

62,620

社区成员

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

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