如何用多线程读取大文件并且做数据处理,100分急等解答!
小弟刚学java,,但对java的多线程以及其他一些东西不太熟悉,尤其是1.5之后似乎原来的并发机制已被更优的方法代替了,更让人不知用什么才好。现在正在做一个实习项目,要求如下:
1,有10个文本文件,每个220M左右,每个文件记录大约2千万条,每条记录格式相同,包括每条记录的原始时间戳,但每条记录中也有些是无用的信息,处理时去掉。
2,要产生用户指定的记录条数,并对其做相应的处理(细节略)
3,将产生的记录放入一个队列中,生产者在队列满时阻塞,消费者在队列空时等待
我的问题是:
1,想用多线程来提高处理的效率,想请问大家的是,有没有办法用多个线程读取一个文件的内容来提高速度,比如线程1读取文件的第一行,线程2同时读取第二行。。。如果这点做不到,那是不是应该把读文件和处理记录放在不同的线程中来提高效率?但是处理记录的方法必须依赖于读到的每一行的内容,如何在不同的线程中实现呢?
2,老师的要求是用一个指定大小的队列来存放这些记录,并根据每条记录的原始时间戳来生成新的时间戳(只是为了保持原有的先后顺序),然后将它们按时间戳排序,等待用户来拿,而用户取得的记录将根据记录的时间戳来决定何时发送给其他人(这点不用我实现)。我本来想用PriorityQueue来实现,但是如果有多个线程在进行生产和获取记录,那么根本保证不了用户拿到所有的记录时是按时间戳排序的,更别说根据时间顺序发送出去了。。。老师说可以让用户自己实现一个sortedSet进行排序,那如果这家伙要生成2亿条记录,估计他得准备个2G内存来存储并排序这些数据了。。。有什么办法可以减少内存开销又获得比较好的性能呢?
3,上面那个queue的问题,好像不但解决不了时间戳的先后顺序,而且多线程在这个queue上根本没用武之地吧?只能一头进一头出,如果空了或者满了,再多的线程都得等着,加上同步的开销,好像还不如单线程来的快。我是否应该改用其他数据结构比如list什么的 加上多线程?
4,最头痛的一点,这个程序到时要部署到多个网络节点上去的,但是老师又说,原始数据太庞大,不想就这样放到每个节点上去。。。那如果不放上去怎么读取到足够的数据呢??用数据库会不会节省些空间开销?或者需要搞分布式?
花了好多时间了,多线程的东西还是一知半解,写程序写到郁闷死,最后发现照我现在的写法多线程还不如单线程快。。。更要命的是结构上还有很多东西没定下来,根本没法往下写了,各位大侠救救我吧!