当前位置:编程学习 > JAVA >>

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

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

各位给支个招 --------------------编程问答--------------------  建议放弃!那也太大了。 --------------------编程问答-------------------- 那么大的文件肯定不能一次性读取进内存再进行操作,你可以每次读取10M后进行操作然后再读下一个10M直到文件结束。你就想像成你拿着一个放大镜看一张超大的纸,你能一次性全部都看到吗?肯定是一点点看,然后不断移动。
如果要提高速度,可以使用多线程。每个线程读取文件指定区域然后查询指定字符串,直到没有可读的文件块为止。 --------------------编程问答-------------------- 大文件的生成,我没遇到过。

查找字符串,可以采用模式匹配。
如果只查找一个字符串的话,可以采用模式匹配,读一遍文件的内容即可查找到所要找的字符串。
当然,读操作一定要选用带缓冲区的Reader。

自我感觉,问题的关键是算法,其次才是环境。 --------------------编程问答-------------------- FileChannal类,可以映射文件的一部分,也就是可以读写文件的一部分内容。。对于,RaodomAccessFile,FileInputStream,FileOutputStream这三个类,可以用getChannal()方法来获取对应的FileChannal.
--------------------编程问答-------------------- 晕 你要是连怎么生成都不知道的话 那还讨论什么读取
我曾经用BufferedReader包了FileReader去读一个2-3G的文件 几行下来没出什么问题 要是全文搜索我倒是没试过 --------------------编程问答-------------------- 不晓得,顶一下 --------------------编程问答-------------------- 顶 --------------------编程问答--------------------   这个真的有点不现实啊。太难了啊 --------------------编程问答--------------------
引用楼主 lptt 的回复:
要求实现读取超大文件(2G左右),并找到指定的字符串/
1.首先这么大的文件,怎么生成呢?
2.怎样读取呢?肯定会死机啊
3.语言或哪种环境好呢?

各位给支个招


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

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

3.语言和环境?
没太大区别吧,偶当时是java实现的
其他的语言也应该能够实现的 --------------------编程问答-------------------- 这个应该很困难吧 即使做出来 不管是读取还是查找速度都相当慢 --------------------编程问答-------------------- 进来学习下到底怎么个读取法... --------------------编程问答-------------------- 用Lucene 建立索引,再查找 --------------------编程问答-------------------- java读写文件是调用本地方法来读写的,最终要用到windows的api。你为什么要把2g大的文件都存放到内存里,就在硬盘里放着,直接读取不就行了?建立一个索引会提高速度。
人家数据库文件有几十个G,频繁读取,也没有听说过内存不够用的 --------------------编程问答-------------------- 边读边查找 --------------------编程问答-------------------- 我实现了一个小demo 在一2G的文本中搜索指定字符串 用了55秒左右, 这个慢吗 --------------------编程问答-------------------- 是平均55秒吗? --------------------编程问答--------------------
引用 15 楼 lptt 的回复:
我实现了一个小demo 在一2G的文本中搜索指定字符串 用了55秒左右, 这个慢吗


不好说
要看你的系统配置
包括jvm的heapsize等 --------------------编程问答-------------------- en 差不多 我每次读10M 左右 估计程序的瓶颈就在于读硬盘的速度了吧  --------------------编程问答--------------------
引用 17 楼 lovecj6185 的回复:
引用 15 楼 lptt 的回复:
我实现了一个小demo 在一2G的文本中搜索指定字符串 用了55秒左右, 这个慢吗


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


兄台 程序还可以怎么优化 我和你的处理方法差不多
用多线程能好些吗 --------------------编程问答-------------------- 先用多线程来读取

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

还要加快速度,就用nio来读吧,映射到内存中,几兆几兆地读就是了 --------------------编程问答-------------------- nio channel来读取 --------------------编程问答--------------------
引用 20 楼 yuwenbao 的回复:
先用多线程来读取

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

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


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

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

偶主要是扩充heapsize,-Xmx1024m 就是把分配给jvm的内存设为1G
当然这要看你机器的性能了
如果2G的内存,还勉强可以这样设 --------------------编程问答-------------------- 我试了一下 我的程序 搜索两个2G的文件(线程1对应第一个,线程2对应第二个)结果用时为85秒 平均分析一个是42秒左右 效率提高20%啊 开线程看来有些优化的 但估计多了就不行了 --------------------编程问答-------------------- 生成文件要多长时间? --------------------编程问答-------------------- 唉。。。线程池啊,开启线程池,我的经验,根据配置不同,五到十个是没什么问题的 --------------------编程问答--------------------
引用 9 楼 lovecj6185 的回复:
引用楼主 lptt 的回复:
要求实现读取超大文件(2G左右),并找到指定的字符串/
1.首先这么大的文件,怎么生成呢?
2.怎样读取呢?肯定会死机啊
3.语言或哪种环境好呢?

各位给支个招


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



楼主,你的程序是啥样子啊。不会是你给你的程序配了5G再来读吧。晕死。看你说的如此简单。 --------------------编程问答--------------------
引用 13 楼 gaoch_2000 的回复:
java读写文件是调用本地方法来读写的,最终要用到windows的api。你为什么要把2g大的文件都存放到内存里,就在硬盘里放着,直接读取不就行了?建立一个索引会提高速度。
人家数据库文件有几十个G,频繁读取,也没有听说过内存不够用的


人家昰分批讀的吧,這么大的文件如果不分批操作,肯定會掛吧!
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,