[求助]简单的两个问题,

asdmonster 2004-04-27 05:29:35
简单问题:
现在要做一个set(保证其中容纳的对象唯一,要求数据量是10,000,000),
现有一个用c++实现的树结构,用了大约三四分钟就完成了这么大容积的数据的初始化,
我用jdk1.4.2的set写的一个代码如下:

public void construct(){
System.out.println(" Start construct");
set = new TreeSet();
Random random = new Random( System.currentTimeMillis());
byte[] array = new byte[100];
for( int i = 0;i<100000;i++){
TestObj obj = new TestObj();
java.util.Date date =new Date( random.nextLong());
obj.setDate( date);
System.out.println(i);
set.add( obj);
}
System.out.println(" end construct");
}

但是只有200,000数据的时候jvm就报内存溢出!!!!但是我的机器512内存显示峰值才300M多一点。我换用common也是一样。

现在该怎么办?我从来没有想到过c++和java的差别这么大。由于业务需要,我也不能采用别的方案将这10,000,000个对象分别载入,只能一次将所有的数据放入内存,但是现在......
以前看一个朋友说过用HashSet,但是现在我确实没有信心。

[问题二]:哪位老大用过免费的java的操作ftp的api呀,sun自己提供的没有没有文档,而且提供的功能有限,edt的又要收钱,哪位老大用过别的比较好用的jar吗?





...全文
42 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
MaxDD 2004-04-29
  • 打赏
  • 举报
回复
看得我迷迷糊糊,坚持学习中。
xkgg 2004-04-29
  • 打赏
  • 举报
回复
up
zijibense 2004-04-29
  • 打赏
  • 举报
回复
up
programer23 2004-04-29
  • 打赏
  • 举报
回复
顶一下
oxv 2004-04-29
  • 打赏
  • 举报
回复
up
fishstudio 2004-04-27
  • 打赏
  • 举报
回复
我的意见是,你的对象在c++当中保存在栈当中,应该能使用虚拟内存

并且地址可以使扩充的。在Java当中使用的都是堆,这是造成溢出的原因,并没有及时垃圾

回收。我的建议是,你构造数据类型,就是set的类,然后一次性构造数组。这比你每一次调

用构造函数要节省栈空间,并且直接形成堆,并能够及时地垃圾回收,具体的垃圾回收机制

在程序员上面有,你可以自己看一下,jvm在运行的时候机制,也是很重要的。

至于你的512内存,我很羡慕,但是要知道os显示的内存并不是真实的物理内存的使用值,你的其他应用程序也是要付出内存代价的,可能有一部分硬盘在忙活了,嘎嘎!
asdmonster 2004-04-27
  • 打赏
  • 举报
回复
marvy(marvy) :

------------------
你说的那个内存消耗的问题,是我估计留下的,因为实际的对象不是TestObj,而是一个很大的东西。
后来我又做了测试,当 set = new HashSet( 10,000,000);的时候,已经报了内存溢出错误(还没有往里面添加数据呀),
marvy 2004-04-27
  • 打赏
  • 举报
回复
楼上的:~)
一并发个来吧!
一起学习。

谢谢!
E-Mail:marvy_lee@yahoo.com.cn
liweisnake 2004-04-27
  • 打赏
  • 举报
回复
对于你的第2个问题,我用过了java的免费ftp的api了,写得非常好,但现在我不在我的住处,等后天我回去了给你发过去,我留一个我的e_mail:liwei_snake@163.com,你给我封信(地址),我后天好发。
marvy 2004-04-27
  • 打赏
  • 举报
回复
试过同样的数据量,是不会有问题的:~)

仅就你这段代码而言,有一点值得商量:
...
for( int i = 0;i<100000;i++){
TestObj obj = new TestObj();
java.util.Date date =new Date( random.nextLong());
obj.setDate( date);
System.out.println(i);
set.add( obj);
}
...
这个循环中,相当于你创建了100000个新的TestObj的对象和100000个Date对象。对JAVA来说,创建新对象还是要付出一定代价的。包括分配数据空间和内存空间。而你这些对象其实没有必要使用新的:~)

可以改成下面的代码,重复使用同一个对象,这样就会使程序的开销减少很多:
...
TestObj obj;
java.util.Date date;
for( int i = 0;i<100000;i++){
obj = new TestObj();
date =new Date( random.nextLong());
obj.setDate( date);
System.out.println(i);
set.add( obj);
}
...
asdmonster 2004-04-27
  • 打赏
  • 举报
回复
回复人: Arias(道) ( ) 信誉:100 2004-04-27 20:15:00 得分:0


没有试过,不过你的处理是否得当只得一问?
java和c++本身就是有一定差别的,你本能把在c++上用的那一套完全的搬到java中

你必须先搞清除,在java中的你的应用处理,才能实现你的c++下的算法!

--------------------------------------------------------------------------
我知道很多人会说我的把100,000,000 个对象放入内存的方法,这是没有办法的办法,
实际情况是需要监控100,000,000个对象,而且需要是实时或者近似实时,而且要求跨平台。
在实际应用中,实际的对象肯定要比TestObj更大......

新来的萌新 2004-04-27
  • 打赏
  • 举报
回复
学习!
Arias 2004-04-27
  • 打赏
  • 举报
回复
没有试过,不过你的处理是否得当只得一问?
java和c++本身就是有一定差别的,你本能把在c++上用的那一套完全的搬到java中

你必须先搞清除,在java中的你的应用处理,才能实现你的c++下的算法!
asdmonster 2004-04-27
  • 打赏
  • 举报
回复
iceandfire(【OPENSOURCE】) :
--------------
我的 TestObject 现在里面就有一个String的成员,然后是简单的get,set,本来还含有一个java.util.Date的,后来出了问题以后我就把那个java.util.Date的成员注释掉了。

onefox(一品狐)
--------------------
效率的差距太过于明显,即使是现在我的内存不溢出,但是我20,000的时候报错用了半个小时!!!!


楼下的各位:
-----------------
大家给出出主意呀,感激不尽。

onefox 2004-04-27
  • 打赏
  • 举报
回复
试试 虚拟机启动参数加内存占用大小
iceandfire 2004-04-27
  • 打赏
  • 举报
回复
对于你的问题一,我在这里生成了200000个对象没有问题,我想你的问题在于TestObj这个对象占用的内存空间到底是多大,要不你把这个对象的代码也贴上,大家来帮你测试一下。
MaxDD 2004-04-27
  • 打赏
  • 举报
回复
强人!学习学习!
loverisyour 2004-04-27
  • 打赏
  • 举报
回复
哈哈,新手,不懂,只能帮你顶拉!
UPUPUPUPUPUPUP!

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧