首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 哎!麻烦的逻辑啊!5555555555555555555555 [已结贴,结贴人:nil2000]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nil2000
    • 等级:
    发表于:2008-06-15 07:44:00 楼主
    会从DB里面得到两个分别100W大小List,List里面都是TxtClass对象!
    然后把这个两个List中,TxtClass对象ID属性的相同的项去掉,合并成一个新的LIST,合并后大概150W左右!
    然后在遍历合并的List,取出TxtClass对象,根据TxtClass对象内容创建txt文件!最后再将合并的List当做对象
    传给其他方法

    由于100w总是溢出,而由于其他原因内存只能设置128M,
    所以不知道下面的怎么修改阿

    Java code
    List sumList=new ArrayList(); for(int i=0;i<10;i++){ //执行sql,获取一个包含10W个TxtClass对象 Sql1 = .....................100000; List tmpList = 10W个TxtClass对象; sumList.add(tmpList); } for(int i=0;i<10;i++){ //执行sql,获取一个包含10W个TxtClass对象 Sql2 = .....................100000; List tmpList = 10W个txtClass对象; sumList.add(tmpList); } int sumSize = sumList.size(); StringBuffer _sb = new StringBuffer(); List finalList=new ArrayList(); for(int i=0;i<sumSize;i++){ List tmpList = (List)sumList.get(i); int tmpSize = tmpList.size(); List finaTmplList=new ArrayList(); for(int j=0;j<sumSize;j++){ TxtClass tmpTxtClass = (TxtClass)tmpList.get(i); String strId = tmpTxtClass.getId(); _sb.append(strId+","); if(_sb.toString().indexOf(strId+",")<0){ //如果该ID从来没有存在过则用tmpTxtClass对象内容生成文件 writeFile(tmpTxtClass); finaTmplList.add(tmpTxtClass); } } finalList.add(finaTmplList); //最后再将合并的List当做对象传给其他方法 xxxClass.xxxMethod(finalList); }
    200  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-15 07:59:011楼 得分:0
    为什么不先通过d b去掉重复的呢?要知道数据库的算法一般都是优化过的,而且db 和web不在一起的话,占用的web的内存更少的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-15 09:44:512楼 得分:0
    列表中的数据要怎么使用?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-15 10:41:383楼 得分:0
    由于100w总是溢出,而由于其他原因内存只能设置128M

    合并后大概150W左右!最后再将合并的List当做对象传给其他方法

    你这样的思路本来就进行不下去,就算前面处理好了,后面也不能合并成功
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-15 10:43:594楼 得分:0
    我觉得你可以考虑不用list,直接在数据库操作

    如果你要写入文件,直接在数据库合并后写入文件
    要传给其他方法,把数据库条件传给其他方法,或者把数据库结果给其他方法

    以上只是提示,具体问题具体分析
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-15 10:51:475楼 得分:0
    给你个思路。
    1.先用sql语句得出唯一ID的List
        数据库中不是有Distinct嘛,别在程序中做这个事情。效率慢很多。
        List <String> list = SQL 执行结果。就是ID的list

    2. 循环这个list,取出的每个Id都去查数据库。然后取出里面的TxtClass对象内容写入到文件中。

    这样做虽然访问数据库的操作多了,但是应该不会出现内存不够的问题了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-15 11:19:146楼 得分:0
    呵呵,别把数据库已经可以解决的问题,揽到自己头上
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-15 12:17:117楼 得分:0
    楼主太关注细节了 囧rz
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-15 12:59:258楼 得分:0
    引用 4 楼 jdlsfl 的回复:
    我觉得你可以考虑不用list,直接在数据库操作

    如果你要写入文件,直接在数据库合并后写入文件
    要传给其他方法,把数据库条件传给其他方法,或者把数据库结果给其他方法

    以上只是提示,具体问题具体分析
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Landor2004
    • 等级:
    发表于:2008-06-15 13:26:329楼 得分:0
    是否可以换个思路,比如数据合并在database中进行

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-15 14:44:1010楼 得分:0
    写个存储过程,所有运算直接在存储过程里面处理,处理完毕后再返回来.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-15 18:41:3311楼 得分:0
    JF
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-15 18:44:1812楼 得分:0
    以上说得对呀 干嘛非得在WEB里面做啊 你直接在DB里面做啊 写存储过程不是更好

    建议你换一种思路
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-16 00:13:0313楼 得分:0
    帮顶下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • AWUSOFT
    • 等级:
    发表于:2008-06-16 00:13:5714楼 得分:200
    引用 1 楼 laorer 的回复:
    为什么不先通过d b去掉重复的呢?要知道数据库的算法一般都是优化过的,而且db 和web不在一起的话,占用的web的内存更少的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-16 09:09:4815楼 得分:0
    JF
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-16 09:56:0316楼 得分:0
    引用 10 楼 cpoysy 的回复:
    写个存储过程,所有运算直接在存储过程里面处理,处理完毕后再返回来.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • norwolfli
    • 等级:
    发表于:2008-06-16 10:23:3717楼 得分:0
    写成文件,再操作吧。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-16 10:55:5518楼 得分:0
    1. 如果数据来自多个表,可以使用连接查询或union得到一个结果集,如果想去掉重复记录使用distinct,要充分利用数据库的计算资源来完成数据的检索和筛选。
    2. 经1处理后如果数据量仍然巨大,可以结合分页方法,将查询结果分若干页一页一页获取再分批处理。否则可能影响数据库服务器性能,并导致堆栈溢出。
    3. 写文件时可以考虑使用线程池来避免线程频繁创建销毁带来的额外开销,但不要将工作线程配置的太多,否则性能不升反降。多次测试一下,找到一个平衡点。
    4. 将JVM的最大可用内存设大点,方法 java -Xmx512m ...,如果是Web应用,则设置相应Web服务器的配置即可。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved