读.dat文件,写入数据库的问题.

lvjx125 2009-12-25 10:46:34
现在在做读取*.dat文件里的数据,并把数据插入到数据库中.问题是现在每导入8万条左右就出问题.
所以想把这个文件的记录分开导入.比如一次导5万条,但是不知道该怎么写.
我导5万后想断开一下再重新导,但是是要从5万零1开始.大家帮个忙吧.多谢了!
...全文
467 19 打赏 收藏 举报
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lvjx125 2010-01-05
问题没有解决,但是要谢谢大家的支持。
  • 打赏
  • 举报
回复
lvjx125 2009-12-29
我才不到20W的数据,导入到10几W的时候就内存溢出了。郁闷啊
  • 打赏
  • 举报
回复
crazylaa 2009-12-29
代码方面?你把文件整个load到内存了呗。。。
  • 打赏
  • 举报
回复
lvjx125 2009-12-29
[Quote=引用 16 楼 crazylaa 的回复:]
引用 14 楼 lvjx125 的回复:
我才不到20W的数据,导入到10几W的时候就内存溢出了。郁闷啊

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

就是啊。能不能帮我分析一下都什么情况会出现这种问题。(代码方面)
  • 打赏
  • 举报
回复
crazylaa 2009-12-29
[Quote=引用 14 楼 lvjx125 的回复:]
我才不到20W的数据,导入到10几W的时候就内存溢出了。郁闷啊
[/Quote]
噢,那就把JVM内存调大点吧。不过这是治标不治本噢。
  • 打赏
  • 举报
回复
lvjx125 2009-12-29
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
  • 打赏
  • 举报
回复
crazylaa 2009-12-28
[Quote=引用 7 楼 lvjx125 的回复:]
求一段能把文件,分成多个的代码。每5万做成一个新文件
[/Quote]


Scanner src = new Scanner(new FileReader("Test.txt"));
然后for循环调用src.nextLine(),移动到指定行数。貌似没有直接移动到指定行的方法。
以前我readbyte也是这么做的。while循环,读过的不再处理,直接skip到指定byte位。
不知道现在1.6有没有这个方法。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 crazylaa 的回复:]
文件总共估计多大?什么数据库?
一般大中型数据库都有导入工具的,如果不存在特殊数据处理,建议还是用数据库工具吧。

如果用程序
.dat文件不知道你是readLine(String)还是read byte的方式。前者的话,直接记录行数,后者的话,记录当前已读完的字节总数。
插入时,采用PreparedStatement的executeBatch,大约1000至10000条提交一次。提交完成后记录当前已提交的上述已读行数or字节数到文件(写内存怕突然程序异常死掉)。
我做过2KW数据量的读字节文件导入,以上方法没问题。
[/Quote]
.~
  • 打赏
  • 举报
回复
crazylaa 2009-12-28
[Quote=引用 10 楼 lvjx125 的回复:]
四、不健壮代码的特征及解决办法
1、尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动设置为null,暗示垃圾收集器来收集该 对象,防止发生内存泄露。对于仍然有指针指向的实例,jvm就不会回收该资源,因为垃圾回收会将值为null的对象作为垃圾,提高GC回收机制效率;
2、我们的程序里不可避免大量使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域;例如
3、尽量少用静态变量,因为静态变量是全局的,GC不会回收的;
4、避免集中创建对象尤其是大对象,JVM会突然需要大量内存,这时必然会触发GC优化系统内存环境;显示的声明数组空间,而且申请数量还极大。
5、尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。
6、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当的使用hashtable,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃
7、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。
[/Quote]

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

while(i<50000)
设计一个静态变量把i。

或设计一个文件标记。

下次从标记加 1 开始读取。

  • 打赏
  • 举报
回复
lvjx125 2009-12-26
DB2数据库,方文件大小在3MB左右吧,大概20W条以内.
readLing(String) 的方式.

采用PreparedStatement的executeBatch,大约1000至10000条提交一次。提交完成后记录当前已提交的上述已读行数or字节数到文件(写内存怕突然程序异常死掉)。 能给写的点代码吗?新手,拜托了!谢谢大家了。
  • 打赏
  • 举报
回复
java_running 2009-12-26
用分页的思想去处理吧
  • 打赏
  • 举报
回复
jabeginner 2009-12-26
更大的数据都可以导。可能文件或者程序有点问题吧

实在不行,就按你的方法来,不过加些改进。就是导完一个删除一个,导完5w再重新开始,这样就不用担心文件起点问题。
  • 打赏
  • 举报
回复
crazylaa 2009-12-26
文件总共估计多大?什么数据库?
一般大中型数据库都有导入工具的,如果不存在特殊数据处理,建议还是用数据库工具吧。

如果用程序
.dat文件不知道你是readLine(String)还是read byte的方式。前者的话,直接记录行数,后者的话,记录当前已读完的字节总数。
插入时,采用PreparedStatement的executeBatch,大约1000至10000条提交一次。提交完成后记录当前已提交的上述已读行数or字节数到文件(写内存怕突然程序异常死掉)。
我做过2KW数据量的读字节文件导入,以上方法没问题。
  • 打赏
  • 举报
回复
lvjx125 2009-12-26
求一段能把文件,分成多个的代码。每5万做成一个新文件
  • 打赏
  • 举报
回复
laker_914 2009-12-25
楼上的方法可以,
  • 打赏
  • 举报
回复
sean1203 2009-12-25
for(int i=1;i《=总行数/50000;i++){
跳到指定行,然后进行下面操作
for(int j=(i-1)*50000+1;j <i*50000;j++){

}
}
指针跳到50000*(--i)
剩余行数=总行数-50000*(i)
继续执行
-------------------
第二种方法貌似效率不高
还是第一种好
如果用第二种的话,可以用多线程来操作各自50000条数据
  • 打赏
  • 举报
回复
sean1203 2009-12-25
应该没问题把
我100万的数据50M的文件都度过
你可以用批量读取然后插入
-------------------------
先获得总行数
然后分段
你5万一读的话
然后用for循环
for(int i=1;i《总行数/50000;i++){
跳到指定行,然后进行下面操作
for(int j=(i-1)*50000+1;j<i*50000;j++){

}
}
再执行剩余的
上面写的有点乱
基本这个意思。。。
  • 打赏
  • 举报
回复
相关推荐
发帖
Web 开发
加入

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2009-12-25 10:46
社区公告
暂无公告