wcz_1985 2009-01-17 10:28
浏览 473
已采纳

关于处理海量文件,求一个比较好的方案?

:? :? :?
我想处理一些文件的文本数据。是以一定的格式如分隔符分开的。这些文件都挺大的。一个文件应该是30M左右。
里面有一些要求,如某些列需要比较进行数据匹配。比如下面
students_1.txt
(格式为:学号,姓名,年龄,姓别,系别,班级)
100001,小A,20,男,0604,061401
100002,小B,20,女,0604,061401
100003,小C,20,男,0604,061401
100004,小D,20,男,0604,061401
100005,小E,20,女,0604,061401
100006,小F,20,男,0604,061401
100007,小G,20,女,0604,061401
(这是一些模拟数据,其实字段比这个还要多很多,大概差不多三十个左右)
工作模式应该是:
读取100个文件时,怎么处理哦?
我之前思路是:
读取:把文件名计算出来放到一个List里,然后迭代List。然后处理相关文件,
匹配:用split方式把它变成字符串数组,用数组元素进行比较
用单线程的方式。即一条线执行下去。一个文件一个文件地打开,读取,匹配,把匹配数据放到内存中关闭,再打开下一个。。。。。

谁有比较好的方案吗?比如匹配,是不是用正则表达式的方式代替split方式会好点。或者还有其它更好的吗?
对于100个文件来说,是不是用多线程的方式会好点?但如果10个线程同时开启。会加载300M文件放到内存中,会不会不合适?
请大哥们帮忙优化一下吧。。。谢谢。。
[b]问题补充:[/b]
匹配没有问题,只是好像使用split方法性能不佳.
其实还涉及到分页的问题.第一次是搜索全部的数据,然后把匹配的数据记录标识(如文件名,位置)等放到一个list里.然后下次再访问的时候,取别的页的时候,可以直接通过记录信息定位到具体的数据.然后取就行了.目前是用RandomAccessFile这个类实现.(用buffer方式对这个类进行了包装).性能还是不是很好.主要是定位到某文件某pointer里.谁有比较好的文件读取器工具吗?
:P :P :P :P
关于多线程搜索.刚才我试了一下,我控制不了.
我想通过一个线程池的方式.然后每次让10个线程进行.
只是不太会控制,如何分配这些线程.
比如我有100个文件,按理说,是一开始让十个线程进行搜索.其它的等待.然后某线程完成了后.再把这个线程分给搜索新文件.
我不知道,完成后,如何告知分配?(目前想着用回调)
但进行的时候,未分配的待搜索文件.如何让他们等待?是用sleep吗?还是?

PS:感谢bohemia 与taopian 的回答.能再给详细点方案吗?谢谢.

  • 写回答

11条回答 默认 最新

  • wwwghost 2009-01-18 02:19
    关注

    [quote]比如匹配,是不是用正则表达式的方式代替split方式会好点。[/quote]
    这真是RE所长。
    [quote]其实还涉及到分页的问题.第一次是搜索全部的数据,然后把匹配的数据记录标识(如文件名,位置)等放到一个list里.然后下次再访问的时候,取别的页的时候,可以直接通过记录信息定位到具体的数据.然后取就行了.目前是用RandomAccessFile这个类实现.(用buffer方式对这个类进行了包装).性能还是不是很好.主要是定位到某文件某pointer里.谁有比较好的文件读取器工具吗? [/quote]
    这就是在某些应用中的所谓Catalog模式,第一次对数据文件建立索引,而后由索引定位。
    [quote]关于多线程搜索.刚才我试了一下,我控制不了.
    我想通过一个线程池的方式.然后每次让10个线程进行.
    只是不太会控制,如何分配这些线程.
    比如我有100个文件,按理说,是一开始让十个线程进行搜索.其它的等待.然后某线程完成了后.再把这个线程分给搜索新文件.
    我不知道,完成后,如何告知分配?(目前想着用回调)
    但进行的时候,未分配的待搜索文件.如何让他们等待?是用sleep吗?还是?
    [/quote]
    涉及到海量数据的处理,多线程肯定需要的,IO瓶颈是必须考虑的。
    具体多线程方案:
    建立一个线程数为10的线程池(参见java.concurrent package),建立搜索任务(同前),然后你只管将task往pool里面扔。Thread pool会帮你管理线程的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(10条)

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘