为什么失败了,说明一下,是内存依然溢出还是速度慢。
从你的方案来说有如下问题。
1 你使用多线程,却写相同的文件。这样要么发生互锁要么每写一条就重新关闭打开一次文件。 这样当然会慢。
   如果你使用多线程,那么为每个线程放个编号,只写与编号相关的文件。 此外太多的小文件会导致打开关闭太频繁。
   建议,建立一个编号池,每个线程从编号池中获取一个编号。 例如 A ,那么写文件 Dat000.A  Dat001.A ... Dat099.A。 当一个文件处理结束后关闭线程时把 A重新放回编号池。  第二次处理临时文件时 把 Dat000.A Dat000.B ... Dat000.Z 的文件合并后一起处理。2 为什么要限制文件的大小。 超过5M 再产生第二个文件。 完全没有必要。记住两点。  
一 不要使用不同的线程同时读写一个文件。 这样肯定出现问题。
二 打开关闭文件 比读写文件慢的多。同一个文件 在同一个线程中 最好只有一次 打开关闭。

解决方案 »

  1.   

    楼主,您没听说过derby吗? jre能跑,derby就能跑。
      

  2.   

    没有大型的数据库,装个access还是可以吧?在要跑程序的机器上配置dns,访问access数据库,不就解决了?非要和自己过不去,........
      

  3.   

    Access数据库比较方便,而且还可以解决楼上的问题,这个想法真的不错..
      

  4.   

    谢谢各位的关心,程序已经完成,Coolfatman对我的帮助十分的巨大,我采用了他的很多设想,试验了很多现在成功。
    程序采用线程池,开启200个线程同时进行处理,在线程结束,回收到线程池,等待下一个文件。
    对I/O流的操作我采用了hashmap以文件名为键,I/O流为值存储。在读取和写入大文件的时候,都可以设定缓存区就可以了。比如:BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(url)),10*1024*1024);差了好久的东西。嘎嘎。。
    还有就是写入的时候一定要清除缓冲区。
    今天进行了1.94G文件测试,效果很让我满意。我遇到的最大的问题就是对于临时文件的读写,因为临时文件有1g以上对其中内容进行解析,很费时。也很耗费内存。我采用了分文件的方式,以号码的后4位为文件名称,将文件分成0000 - 9999个文件。这个每个文件只有MB级别,有的只有几KB。这样减少了内存的操作。还有就是去重的问题。我一开始采用的是string【】2个string【】进行遍历,很耗时,但是list又放不下那么多数据,但是我分成0000 - 9999个文件,就list就可以存下了,这个时候采用hashset的方式去重效率很高。但是因为文件太对,但文件里边的内容不多,单个文件处理很快,但是打开文件关闭文件是很慢的,而且容易内存溢出。总体来说,程序的设计我个人比较满意,功能已经完全实现。谢谢大家,154781079为我的QQ我希望能和大家多多讨论。也希望我的这些想法能帮助到以后碰到和我一样困难的人。