又见csdn!- - !大家帮忙出出主意!谢谢又跟数据干上啦!现在手里(mssql2000下)的5000W数据要导入mysql,编程
又见csdn!- - !大家帮忙出出主意!谢谢 又跟数据干上啦! 现在手里(mssql2000下)的5000W数据要导入mysql,编程实现的。 因为5000W数据的来源不同,所以存在用户名和Email重复的问题, 进而每插入一条数据的前,都要和已插入的所有数据进行判断,并作出相应的操作。 随着插入的数据的增多,导入开始变得慢下来了,最终导到20W的时候,终于内存溢出啦。 不知道大家有没有什么好多建议,或者谁做过大数据的移植,还是这样有条件的移植 - - ! 大家指教一下,小雨十分感激。 附加:每次我都是手动执行这次导多少(5000)条,能不能让它自动导,点下开始就开始导,每次导入固定条数,然后继续导下多少条?并且可以随时 暂停下来,点继续就接着导入,因为数据大,所以一次次操作太累了,谢谢大家。
Java codeHTTP Status 500 -type Exception reportmessagedescription The server encountered an internal error () that prevented it from fulfilling this request.exceptionjavax.servlet.ServletException: Servlet execution threw an exceptionroot causejava.lang.OutOfMemoryError: Java heap spacenote The full stack trace of the root cause is available in the Apache Tomcat/6.0.16 logs.Apache Tomcat/6.0.16 [解决办法] 小雨,我不会,只能顶了
[解决办法] 帮顶!每次插入固定条数的数据后,清空一下试试
[解决办法] 嘿嘿,纯粹不懂,精神支持啊,嘿嘿·····
[解决办法] 帮顶,这么大的数据量啊
[解决办法] 写个线程,导一部分,就暂停释放一下空间,不知道行不行,也没试过
[解决办法] 对数据库不太熟悉:
能否建立个文件数据库先既根据英文a---z分,然后a之中又根据name的长度进行划分(长度1--10、11--15、16-20、20--XXX),,先把名字和Email进行分类(不知道名字是否包含中文,还有名字和Email是对应的还是每个都是独立项)写到文件中,这样的话就会减少很多比较次数,有点像中英文字典的模式,最后在将文件导入到数据库中(不知道能否导入,呵呵,否则这么大的数据量,任何机器都处理不了的)。
[解决办法] 我专门做数据入库的,每次都是千万级数据,不过我用的是Oracle,最后总结一句话:
对于文件类型\XML型的原数据一定要论块解析入库.
[解决办法] 不过你要验证就有点麻烦了,看能不能建张临时表做,我以前遇到这个问题就是这么做的
[解决办法] 我也帮你顶下吧!哈哈。。
[解决办法] 俺也没做海量数据的入库处理,只能帮楼主顶一下喽,顺便也学习一下哈。
[解决办法] 不来灌水,新手一个!纯属支持!
我要跟大家多多学习一下啊!
[解决办法] 提个想法:分解为可以处理的多个部分,比如10W一组,分组比较确定重复的项,这样就可以避免内存溢出。
[解决办法] 厉害,努力学习中,帮顶!
[解决办法] 你能不能在导入数据库之前就把数据区分好了,然后再导入,否则这么大的数据量,有点悬。
[解决办法] 很强大,帮顶
[解决办法] 探讨 先全部插入,再在mysql上判断删除重复的。[解决办法] 麻烦哦!5000w 不是个小数目哦,特别是还有重复的检测问题
1 用户名和Email 这2个必须做索引,否则在检测重复时会有问题,谁让你的数据源不同呢!这属于合并数据哦
2 使用批量insert 操作
3 使用生产者消费者模式,用多线程
4 不要用web方式,这东西肯定是客户端的应用程序
只能说到这里了。再细的就得你自己考虑了。总之,批量insert和多线程肯定能加快速度。
[解决办法] 写一个存储过程里再写游标,存储过程里写个数量判断的语句,一次设定插多少,在游标里写个Where语句做重复检测。
[解决办法] 一批批地传
[解决办法] 大批数据的不大懂耶!!![解决办法] 强啊,关注中。。。[解决办法] mysql 有一个 专门支持 ODBC的驱动。名字叫做 MYODBC。 也以提供mysql的odbc支持。 装了之后 在 sql2000下直接把数据导成mysql形式的。。 PS: 我从网上查的.. 希望能用的上.[解决办法] 厉害,努力学习中,帮顶![解决办法] 你的数据是不是来源于文件,还是其他数据库,如果是文件,用 内存映射文件 来解决,参考 java.nio.*包[解决办法]
探讨 引用: mysql 有一个 专门支持 ODBC的驱动。名字叫做 MYODBC。 也以提供mysql的odbc支持。 装了之后 在 sql2000下直接把数据导成mysql形式的。。 PS: 我从网上查的.. 希望能用的上. 谢谢,myodbc,以前我导数据的时候用过,但是没有条件过滤的啊。我复杂的逻辑判断没法做,只适合做迁移。[解决办法] 先在mssql里处理啊
选一个email(top 1)
选所有与此email相同的记录(好吧,我猜测这个数目不会很大)
代码处理这些记录,按照你的规则,导入到mysql当中。
从mssql当中删除这些记录。
如果有100万记录都有相同的email,那就难做了。
[解决办法] 探讨 帮顶,这么大的数据量啊[解决办法] 不是很明白啊,没导过东西
[解决办法] 首先,只有email是真实的,因为很多网站注册要email可用。
其次,其他信息嘛,靠程序很难判断,比如真实姓名叫 范伟 的,100%是假的,但是叫 王亮 的,很可能50%是真的,代码怎么可能判断?
[解决办法] 能不能先在mssql2000中先建2个结构相同的表 一个保存用户名和邮件都不同的数据(A) 另一个保存剩余的数据(B) 然后如果B表的数据不足20万就按你原来的方法先处理 完后剩余的A表就直接插入
如果B表大于20万那就按邮件不同和有重复的再分2个表 一个C表保存邮件不重复(用户名肯定是重复) 一个D表保存余下的(邮件重复) 再将C表处理(2、如果用户名重复,Email不重复,则把Email作为用户名) D表按你的方法先处理 完后是直接插入A和C表
[解决办法] 我觉得你在导入到mysql之前可以将那些数据先进行比较,
在一张表里的数据应该不会有重复项,所以只要用A表的数据和b的先比交
只是比较,有你说的那样的就处理其中一张表的,
这样的比较次数就应该是(A表中的数据量*b表中的数据量)
会比你那样做少了很多的比较次数,等这些都做好了
在导入到mysql
不知道可不可行,我是这么想的!
[解决办法] 我曾经测试过2W条数据一次导入到mysql
导入到第11个2W的时候跑不动了 呵呵 关注中
[解决办法] 不会,实话实说。帮你顶一下好了!
[解决办法] 我只能给个建议
先把那些唯一约束禁用
写SQL脚本导入数据
再删那些重复email的字段
再启用约束
[解决办法] memberList = this.queryTargetMem(conn_target);
这条语句mysql数据多了应该不行 可以弄个全局的arraylist<User>(); 每次插入mysql的用户就加到这个集合里 以后就不用去查mysql;我觉得首先还是要在mssql2000这边把数据分开 程序判断的只能是少量数据 如果最后有重复的数据 也可以在mysql那边删除
[解决办法] 不知道你的数据源是什么?
每个数据库都有命令导入数据库文件。
如果不行,用sql脚本是一个选择,如果你会写存储过程是最好的。
先录入数据,再用sql脚本筛选,效率比程序筛选高很多。
[解决办法] 帮顶, 学习!!!!!!
[解决办法] 先把数据导入一个hash表中 然后在这个hash表中判断
把重复的删除 然后把这个hash表传入 你的 写数据库 程序中循环这个hash 批量写入
不要把判断 和 插入数据库 放在一起
[解决办法] 探讨 引用: 先全部插入,再在mysql上判断删除重复的。 为什么会越来越慢,而且内存溢出?我想是你为了解决用户名重复而做的判断吧。。 可以试试wufongming说的,想全部插入,不用那么多判断,应该很快的。。 然后写一存储过程或者几条sql,把用户名重复的去掉。
[解决办法] 顶,学习
[解决办法] 顶一下,顺便学习了。
[解决办法] 不懂啊!先顶一下在帮你找吧!
[解决办法] 44才知道!mysql能支持多少数据量?
[解决办法] 为什么不能先在本地把重复的数据找出来.全部清理干净再导入呢?
[解决办法] 探讨 麻烦哦!5000w 不是个小数目哦,特别是还有重复的检测问题 1 用户名和Email 这2个必须做索引,否则在检测重复时会有问题,谁让你的数据源不同呢!这属于合并数据哦 2 使用批量insert 操作 3 使用生产者消费者模式,用多线程 4 不要用web方式,这东西肯定是客户端的应用程序 只能说到这里了。再细的就得你自己考虑了。总之,批量insert和多线程肯定能加快速度。[解决办法] 用多线程是否可以解决问题,主程序不断的取得固定条数的源数据放到内存中,可以用两块内存交替存储,并设定锁机制,同时启动一个后台线程不断的从这两块内存中取得数据,进行入库操作,当处理完之后,及时清空这两块内存。这样循环处理知道所有的数据都处理完成。
[解决办法] 先处理出中间结果,把该过滤都过滤好然后导入
[解决办法] 分布式排重
[解决办法] 探讨 为什么不能先在本地把重复的数据找出来.全部清理干净再导入呢?[解决办法] 您说说具体怎么做么啊,期待!!
[解决办法] 友情帮顶,关注中。。。
[解决办法] 探讨 引用: 分布式排重 太简洁了,不懂啊。[解决办法] 探讨 引用: 首先,只有email是真实的,因为很多网站注册要email可用。 其次,其他信息嘛,靠程序很难判断,比如真实姓名叫 范伟 的,100%是假的,但是叫 王亮 的,很可能50%是真的,代码怎么可能判断? ---------------- 不明白您说的意思啊,这个和导数据冲突吗?[解决办法] 不好办呀!只有支持了。。。
[解决办法] 你的数据格式是什么样子的啊?是SQL语句还是类似于表格的?
操作系统是什么?Windows还是Linux?
一定要用JAVA吗?
如果是表格式的数据并且是Linux系统的话建议用shell和awk处理完导入
5000W的数据量没有试过,但是一次20W很快的
把记录每20W条放在一个文件里,然后先在文件内判断重复,然后再文件间去重,最后一个一个文件导进去就好了
[解决办法] 帮小雨顶
[解决办法] 小雨的帖子。。 帮顶。 。
[解决办法] 没办法了 看来只有用我的办法帮你了
直接insert吧
加油
[解决办法] 简单,
分为两步:
全部导入
读取第一条记录慢慢扫描重复。
可以考虑写50个线程来扫。
推荐用c++写。
[解决办法] 探讨 用多线程是否可以解决问题,主程序不断的取得固定条数的源数据放到内存中,可以用两块内存交替存储,并设定锁机制,同时启动一个后台线程不断的从这两块内存中取得数据,进行入库操作,当处理完之后,及时清空这两块内存。这样循环处理知道所有的数据都处理完成。我的异常网推荐解决方案: The server encountered an internal error () that prevented it from fulfilling this request.,http://www.myexception.cn/java-web/317.html