现在在做读取*.dat文件里的数据,并把数据插入到数据库中.问题是现在每导入8万条左右就出问题.
所以想把这个文件的记录分开导入.比如一次导5万条,但是不知道该怎么写.
我导5万后想断开一下再重新导,但是是要从5万零1开始.大家帮个忙吧.多谢了!

解决方案 »

  1.   

    应该没问题把
    我100万的数据50M的文件都度过
    你可以用批量读取然后插入
    -------------------------
    先获得总行数
    然后分段
    你5万一读的话
    然后用for循环
    for(int i=1;i《总行数/50000;i++){
           跳到指定行,然后进行下面操作
           for(int j=(i-1)*50000+1;j<i*50000;j++){
                         
           }
    }
    再执行剩余的
    上面写的有点乱
    基本这个意思
      

  2.   

    for(int i=1;i《=总行数/50000;i++){ 
          跳到指定行,然后进行下面操作 
          for(int j=(i-1)*50000+1;j <i*50000;j++){ 
                        
          } 

    指针跳到50000*(--i)
    剩余行数=总行数-50000*(i)
    继续执行
    -------------------
    第二种方法貌似效率不高
    还是第一种好
    如果用第二种的话,可以用多线程来操作各自50000条数据
      

  3.   

    文件总共估计多大?什么数据库?
    一般大中型数据库都有导入工具的,如果不存在特殊数据处理,建议还是用数据库工具吧。如果用程序
    .dat文件不知道你是readLine(String)还是read byte的方式。前者的话,直接记录行数,后者的话,记录当前已读完的字节总数。
    插入时,采用PreparedStatement的executeBatch,大约1000至10000条提交一次。提交完成后记录当前已提交的上述已读行数or字节数到文件(写内存怕突然程序异常死掉)。
    我做过2KW数据量的读字节文件导入,以上方法没问题。
      

  4.   

    DB2数据库,方文件大小在3MB左右吧,大概20W条以内.
    readLing(String) 的方式.采用PreparedStatement的executeBatch,大约1000至10000条提交一次。提交完成后记录当前已提交的上述已读行数or字节数到文件(写内存怕突然程序异常死掉)。 能给写的点代码吗?新手,拜托了!谢谢大家了。
      

  5.   

    可以每次读取一行,如果数据是按行写入的。while(i<50000)
    设计一个静态变量把i。或设计一个文件标记。下次从标记加 1 开始读取。
      

  6.   

    四、不健壮代码的特征及解决办法 
    1、尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动设置为null,暗示垃圾收集器来收集该 对象,防止发生内存泄露。对于仍然有指针指向的实例,jvm就不会回收该资源,因为垃圾回收会将值为null的对象作为垃圾,提高GC回收机制效率; 
    2、我们的程序里不可避免大量使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域;例如 
    3、尽量少用静态变量,因为静态变量是全局的,GC不会回收的; 
    4、避免集中创建对象尤其是大对象,JVM会突然需要大量内存,这时必然会触发GC优化系统内存环境;显示的声明数组空间,而且申请数量还极大。 
    5、尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。 
    6、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当的使用hashtable,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃 
    7、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。
      

  7.   



    Scanner src = new Scanner(new FileReader("Test.txt"));
    然后for循环调用src.nextLine(),移动到指定行数。貌似没有直接移动到指定行的方法。
    以前我readbyte也是这么做的。while循环,读过的不再处理,直接skip到指定byte位。
    不知道现在1.6有没有这个方法。
      

  8.   

    JVMST109: Insufficient space in Javaheap to satisfy allocation request
    JVMST109: Insufficient space in Javaheap to satisfy allocation request
    JVMDG217: Dump Handler is Processing OutOfMemory - Please Wait.
    JVMDG315: JVM Requesting Heap dump file
    ..................................................JVMDG318: Heap dump file written to D:\WebSphere\AppServer\bin\heapdump.20091228.203708.1684.phd
    JVMDG303: JVM Requesting Java core file
    JVMDG304: Java core file written to D:\WebSphere\AppServer\bin\javacore.20091228.203726.1684.txt
    JVMDG274: Dump Handler has Processed OutOfMemory.
    JVMST109: Insufficient space in Javaheap to satisfy allocation request
    JVMDG217: Dump Handler is Processing OutOfMemory - Please Wait.
    JVMDG315: JVM Requesting Heap dump file
      

  9.   

    噢,那就把JVM内存调大点吧。不过这是治标不治本噢。
      

  10.   

    代码方面?你把文件整个load到内存了呗