免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5567 | 回复: 22
打印 上一主题 下一主题

如何一次插入200万条记录? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-16 14:42 |只看该作者 |正序浏览
我用JAVA通过循环插入200万条记录到SQLServer 2000中,运行以后等了5分钟左右机子就蓝屏报错:物理内存不够,然后重启机器,查看数据库,数据库已经插入了3万多条
现问各位这与什么有关,又如何插入这200万条?
谢谢大家!

[ 本帖最后由 LiveHappy 于 2006-10-16 15:47 编辑 ]

论坛徽章:
0
23 [报告]
发表于 2006-10-21 08:36 |只看该作者
本来不是问题的问题

论坛徽章:
0
22 [报告]
发表于 2006-10-21 08:26 |只看该作者
你自己看看吧
package test;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class TEst {
        public static void main(String[] args) {
                int count = 2000000;
                System.out.println("e:" + File.separator + "outTemp.dat");

                try {
                        File fileOut = new File("e:" + File.separator + "outTemp.dat");
                        fileOut.createNewFile();
                        if (fileOut.canWrite()) {
                                FileOutputStream         fileOutStr = new FileOutputStream(fileOut);
                                BufferedOutputStream bufferedOut = new BufferedOutputStream(
                                                fileOutStr);
                               
                                for (int i = 0; i < count; i++) {
                               
                                        String outStr = "123456," + i + ","
                                                        + Math.round(Math.random() * 100000000) + "\n";
                                        byte outBy[] = outStr.getBytes();
                                        bufferedOut.write(outBy);
                                        // System.out.println(i);
                                }
                                bufferedOut.close();
                                fileOutStr.close();
                        }
                        else {
                                System.out.println("can't to write.");
                        }
                       

                } catch (IOException ex3) {
                }
        }
}

论坛徽章:
0
21 [报告]
发表于 2006-10-21 08:12 |只看该作者
原帖由 LiveHappy 于 2006-10-17 10:47 发表


不知道怎么生成文件可以快点,下面是这生成文件的代码,很慢,请指教下,谢谢


int count = 2000000;
        String outStr = "";
        //但是这个循环很慢,我只测了下下面的for循环,光 ...

你写的程序就该拍死
nt count = 2000000;
        String outStr = "";
        //但是这个循环很慢,我只测了下下面的for循环,光这个循环就执行近一个小时还没执行完这个循环
        for(int i=0;i<count;i++)
        {
            outStr +="123456,"+i+","+ Math.round(Math.random() * 100000000)+"\n";
            //System.out.println(i);
        }
        
你在这里创建了一个超级巨大字符串

[ 本帖最后由 tong0245 于 2006-10-21 08:34 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2006-10-21 08:07 |只看该作者
原帖由 myithead 于 2006-10-20 23:36 发表
用Hibernate或许也会简单些
另外,我记得好象string类型的对象,每用一次"+"连接,都会产生一个新的string对象,直到JVM关闭才会被释放,
因此,你的内存被耗光很有可能就是这些临时对象的占用.


hibernate 个屁   200万记录用hibernate
另外在循环中的对象只要循环结束会马上收集。

解决的简单办法是用stringbuilder 或者stringbuffer都可以。
另外"dddd"+"ddddd"+"ds"是不会重复创建对象的 编译器做了优化。
Sting ddd="dd";
dd+="dd"
编译器就没有办法了
技术问题说话还是要负责的 说屁话不好
另外告诉楼主 找出问题最好的方式是做profile
netbeans 和eclipse 都用相关的插件
原帖由 yaoxiujun 于 2006-10-21 00:52 发表
创建事务
-over


另外创建事务 创建个屁  事务事务 个屁
200W 记录就不应该闲的用程序那么去插入。
jdbc 再快每次也要串行化对象的 问题出在这里的问题更大。
如果楼主有心的话 做个profile 比什么都强 问什么问啊 性能问题很可能是多方面的。
要看你具体环境。

[ 本帖最后由 tong0245 于 2006-10-21 08:28 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2006-10-21 00:52 |只看该作者
创建事务
-over

论坛徽章:
0
18 [报告]
发表于 2006-10-20 23:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
17 [报告]
发表于 2006-10-18 11:43 |只看该作者

  1.      for (int j = QiShiHaoMa; j < QiShiHaoMa + count; j++) {
  2.        proRandom randomM = new proRandom();//产生随机数
  3.        if (arrayList1.contains(j)) {
  4.          String JX = String.valueOf(arrayList2.get(j)) + "Բ";
  5.          String SQL = "insert into XinXi(fapysxx_dm,fapysxx_hm,fapysxx_mm,fapysxx_jx,fapysxx_qh) values(" +
  6.              DaiMa + "," + j + "," + randomM.createInteger() + "," +
  7.              JX + "," + QH + ")";
  8.          databaseCon3.executeUpdate(SQL);
  9.        }
  10.        else {
  11.          String SQL = "insert into XinXi(fapysxx_dm,fapysxx_hm,fapysxx_mm,fapysxx_jx,fapysxx_qh) values(" +
  12.              DaiMa + "," + j + "," + randomM.createInteger() + ",'" +
  13.              defaultJX + "'," + QH + ")";
  14.          databaseCon3.executeUpdate(SQL);
  15.        }




  16. //---------------------------在MySQL里可以这样,但在SQL Server我就不清楚了--------------------------------


  17. String SQL = "insert into XinXi(fapysxx_dm,fapysxx_hm,fapysxx_mm,fapysxx_jx,fapysxx_qh) values";

  18.      for (int j = QiShiHaoMa; j < QiShiHaoMa + count; j++) {
  19.        proRandom randomM = new proRandom();//产生随机数
  20.        if (arrayList1.contains(j)) {
  21.          String JX = String.valueOf(arrayList2.get(j)) + "Բ";
  22.               SQL += "(" + DaiMa + "," + j + "," + randomM.createInteger() + "," +JX + "," + QH + "),";
  23.           }else {
  24.          SQL +="(" +
  25.              DaiMa + "," + j + "," + randomM.createInteger() + ",'" +
  26.              defaultJX + "'," + QH + "),";
  27.         }
  28.    }

  29. //此处加一行代码处理掉SQL里的最后一个 ',' 号

  30. databaseCon3.executeUpdate(SQL);
复制代码


------------------------
不过对于二百万的记录不知我这种方法是否有用,应该是占内存太大了!!!

[ 本帖最后由 tsgx8848 于 2006-10-18 11:49 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2006-10-18 09:53 |只看该作者
看错了,建议生成文件导入

ddlutils是一个很方便的工具 http://db.apache.org/ddlutils/

论坛徽章:
0
15 [报告]
发表于 2006-10-18 09:29 |只看该作者
org.apache.ddlutils

不要再去发明轮子了
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP