:? :? :?
我想处理一些文件的文本数据。是以一定的格式如分隔符分开的。这些文件都挺大的。一个文件应该是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 的回答.能再给详细点方案吗?谢谢.
[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会帮你管理线程的。
[quote]读取,匹配,把匹配数据放到内存中关闭[/quote]
一般这样处理就差不多了吧.每行的处理逻辑简单;
[quote]如某些列需要比较进行数据匹配[/quote]
如果需要对固定的列做处理;貌似正则表达式做起来,麻烦些;
如果你的文件,每个的规则都不同;要写N个规则,换比不上单个处理起来块;
如果要提高总体效率,可以采用多线程方式; 不过这样对内存占用无法限制;
我感觉比不上上面的方式好.
文件按行读的话,内存肯定不会有问题的。
至于是不是要多线程,要看你处理完数据,把数据放到哪里?
多线程读,肯定没有问题,但是写就要注意一下了。
个人建议用正则表达式进行分组,后封装。再加上一个对象缓存器模式。
就这点文件, 怎么分析文件格式, 都是很快的, 一个线程差不多了。 瓶颈是在IO上。 楼主不相信的话, 你可以创建一个5G的文件测试下, CPU的计算非常快, 都是在等待读文件上。
你用单线程跑一下,看看CPU是否已经100%了? 如果已经是了,就没必要多线程了,反而增加复杂性.
可以考虑使用临时表(内存数据库就可以了).你先入库再处理.
涉及到海量数据的处理,多线程肯定需要的,IO瓶颈是必须考虑的。
具体多线程方案:
建立一个线程数为10的线程池(参见java.concurrent package),建立搜索任务(同前),然后你只管将task往pool里面扔。Thread pool会帮你管理线程的。
这个说的很正确,我补充一点,还需要在你的工作现场中加一个状态,用于表示当前文本处理的状态,成功失败正在处理等. 你只有当所以的任务都成功了你才能进行相关的后续工作.
不好意思写错 是工作线程.
建立搜索任务(同前)-->引导线程
然后你只管将task往pool里面扔-->工作线程
你为什么不建立索引。用lucene为你的文件数据建立索引,再搜索就快了