w***g 发帖数: 5958 | 1 一点点数据就out-of-memory了,ft。一个int数组,ArrayList偏偏不支持int,要用In
teger对象,开销一下子增加三四倍。简直就是傻B。4G的内存都不够干个P的。辛辛苦
苦编了好几天的程序没法用了,可能要退回fortran了。
不知道怎么办才好了... |
D*******a 发帖数: 3688 | 2 我觉得java,c#这样的vm语言都不适合做需要用大规模数组运算的东西
In
【在 w***g 的大作中提到】 : 一点点数据就out-of-memory了,ft。一个int数组,ArrayList偏偏不支持int,要用In : teger对象,开销一下子增加三四倍。简直就是傻B。4G的内存都不够干个P的。辛辛苦 : 苦编了好几天的程序没法用了,可能要退回fortran了。 : 不知道怎么办才好了...
|
w***g 发帖数: 5958 | 3 竟然还有人用mapreduce实现矩阵运算的,简直就是笑话。100台机器没有1台机器用
fortran算得快的。
【在 D*******a 的大作中提到】 : 我觉得java,c#这样的vm语言都不适合做需要用大规模数组运算的东西 : : In
|
g*****g 发帖数: 34805 | 4 Did you use -Xmx when you start you JVM?
JVM by default only uses 64MB memory, it doesn't matter how much memory
you have if you don't specify Xmx.
Also, if you don't like ArralyList for whatever reason, use int[] then.
In
【在 w***g 的大作中提到】 : 一点点数据就out-of-memory了,ft。一个int数组,ArrayList偏偏不支持int,要用In : teger对象,开销一下子增加三四倍。简直就是傻B。4G的内存都不够干个P的。辛辛苦 : 苦编了好几天的程序没法用了,可能要退回fortran了。 : 不知道怎么办才好了...
|
w***g 发帖数: 5958 | 5 我用了4000! int[]不能动态长的!等下把16G内存全都用上试试。
我的问题其实很简单。最多500,000个128维浮点数特征向量,两两比较距离,算每个
特征向量的100个最近点。我估算了一下实际用到的内存也就1G都不到:
特征向量: 500,000 * 128 * 4 = 256M
100个最近点: 500,000 * 100 * (4 + 8) = 600M (每个点保存8位id和4位距离)。
我就不知道怎么用java编出来overhead能那么大。
【在 g*****g 的大作中提到】 : Did you use -Xmx when you start you JVM? : JVM by default only uses 64MB memory, it doesn't matter how much memory : you have if you don't specify Xmx. : Also, if you don't like ArralyList for whatever reason, use int[] then. : : In
|
g*****g 发帖数: 34805 | 6 4000? You mean -Xmx4000M? Also you want to tweak Xms to
avoid runtime allocation.
BTW, unless you are use 64bits JVM, you can't use more than 4G.
Personally we've used single java JVM to accomodate thousands of
concurrent user sessions. I tend to believe it's your own problem.
You can also use JConsole to check your memory usage.
【在 w***g 的大作中提到】 : 我用了4000! int[]不能动态长的!等下把16G内存全都用上试试。 : 我的问题其实很简单。最多500,000个128维浮点数特征向量,两两比较距离,算每个 : 特征向量的100个最近点。我估算了一下实际用到的内存也就1G都不到: : 特征向量: 500,000 * 128 * 4 = 256M : 100个最近点: 500,000 * 100 * (4 + 8) = 600M (每个点保存8位id和4位距离)。 : 我就不知道怎么用java编出来overhead能那么大。
|
w***g 发帖数: 5958 | 7 我不是dummy的说,跑得是64位的centos和java server模式。先来发泄一下。等下哄小
孩睡下了再来好好解决解决这个问题。
也有肯能使mapreduce framework的问题,实际单个task可用的内存远远小于总的heap
size。
【在 g*****g 的大作中提到】 : 4000? You mean -Xmx4000M? Also you want to tweak Xms to : avoid runtime allocation. : BTW, unless you are use 64bits JVM, you can't use more than 4G. : Personally we've used single java JVM to accomodate thousands of : concurrent user sessions. I tend to believe it's your own problem. : You can also use JConsole to check your memory usage.
|
g*****g 发帖数: 34805 | 8 Did you specify -d64? If you are not dummy, you can estimate
your memory usage beforehand, and if it's enough, it should be
enough.
I would use JConsole or VisualVM to check what's using the
memory. It could be a memory leak.
【在 w***g 的大作中提到】 : 我不是dummy的说,跑得是64位的centos和java server模式。先来发泄一下。等下哄小 : 孩睡下了再来好好解决解决这个问题。 : 也有肯能使mapreduce framework的问题,实际单个task可用的内存远远小于总的heap : size。
|
w***g 发帖数: 5958 | 9 难道64位Linux下的java默认是按32位工作的?这倒是我见识短了...
多谢goodbug大侠相助。我过几个小时来汇报结果。
【在 g*****g 的大作中提到】 : Did you specify -d64? If you are not dummy, you can estimate : your memory usage beforehand, and if it's enough, it should be : enough. : I would use JConsole or VisualVM to check what's using the : memory. It could be a memory leak.
|
g*****g 发帖数: 34805 | 10 据我所知是这样的。不过64bit 更耗内存。
【在 w***g 的大作中提到】 : 难道64位Linux下的java默认是按32位工作的?这倒是我见识短了... : 多谢goodbug大侠相助。我过几个小时来汇报结果。
|
|
|
g*****g 发帖数: 34805 | 11 这个多半是你程序写得有问题,dump一下heap看到底都是被啥
吃了吧。
【在 w***g 的大作中提到】 : 我用了4000! int[]不能动态长的!等下把16G内存全都用上试试。 : 我的问题其实很简单。最多500,000个128维浮点数特征向量,两两比较距离,算每个 : 特征向量的100个最近点。我估算了一下实际用到的内存也就1G都不到: : 特征向量: 500,000 * 128 * 4 = 256M : 100个最近点: 500,000 * 100 * (4 + 8) = 600M (每个点保存8位id和4位距离)。 : 我就不知道怎么用java编出来overhead能那么大。
|
D*******a 发帖数: 3688 | 12 mapreduce的优点不是快,而是可以处理很大的数据(TB级别)
【在 w***g 的大作中提到】 : 竟然还有人用mapreduce实现矩阵运算的,简直就是笑话。100台机器没有1台机器用 : fortran算得快的。
|
h*****0 发帖数: 4889 | 13 显然就不应该用ArrayList...
In
【在 w***g 的大作中提到】 : 一点点数据就out-of-memory了,ft。一个int数组,ArrayList偏偏不支持int,要用In : teger对象,开销一下子增加三四倍。简直就是傻B。4G的内存都不够干个P的。辛辛苦 : 苦编了好几天的程序没法用了,可能要退回fortran了。 : 不知道怎么办才好了...
|
w***g 发帖数: 5958 | 14 有什么更好的类可以用?类似于c++的vector那种。
【在 h*****0 的大作中提到】 : 显然就不应该用ArrayList... : : In
|
r*********r 发帖数: 3195 | |
h*****0 发帖数: 4889 | 16 你这个是计算程序啊。直接开个int[]就可以了。最多包在一个类里,类里面再加几个
属性来标记当前用到的是哪些数据。
c++里的vector基本上就是这么实现的。
【在 w***g 的大作中提到】 : 有什么更好的类可以用?类似于c++的vector那种。
|
c*****t 发帖数: 1879 | 17 Come on. It should take you less than 15 min to write one from scratch.
Lazy...
【在 w***g 的大作中提到】 : 有什么更好的类可以用?类似于c++的vector那种。
|
d****p 发帖数: 685 | 18 楼主都说了int[]是静态的长度不能变.
【在 h*****0 的大作中提到】 : 你这个是计算程序啊。直接开个int[]就可以了。最多包在一个类里,类里面再加几个 : 属性来标记当前用到的是哪些数据。 : c++里的vector基本上就是这么实现的。
|
d****p 发帖数: 685 | 19 如果计算过程中数组长度不变,可以先用ArrayList生成数据在在计算前再转
成int[]
如果计算过程中数组动态,只能自己写容器了.或者用c++
In
【在 w***g 的大作中提到】 : 一点点数据就out-of-memory了,ft。一个int数组,ArrayList偏偏不支持int,要用In : teger对象,开销一下子增加三四倍。简直就是傻B。4G的内存都不够干个P的。辛辛苦 : 苦编了好几天的程序没法用了,可能要退回fortran了。 : 不知道怎么办才好了...
|
b******e 发帖数: 1861 | 20 use cern colt library.
It has IntArrayList, LongArrayList etc. Good fit for your program. |
|
|
d****p 发帖数: 685 | 21 Interesting. Is it efficient? Noticed that it has a beforeInsert function.
If the implementation is aimed at
balancing support for both array and list, I doubt it will be faster than a
hand-written simple int container.
【在 b******e 的大作中提到】 : use cern colt library. : It has IntArrayList, LongArrayList etc. Good fit for your program.
|
g*****g 发帖数: 34805 | 22 你以为ArrayList怎么来的,一样是用静态int[],然后不够了
加倍复制。
【在 d****p 的大作中提到】 : 楼主都说了int[]是静态的长度不能变.
|
d****p 发帖数: 685 | 23 I am not a Java guy :-)
But I doubt ArrayList's internal implementation is based array. It could be,
of course.
【在 g*****g 的大作中提到】 : 你以为ArrayList怎么来的,一样是用静态int[],然后不够了 : 加倍复制。
|
g*****g 发帖数: 34805 | 24 It is, java is open source, you can check yourself.
be,
【在 d****p 的大作中提到】 : I am not a Java guy :-) : But I doubt ArrayList's internal implementation is based array. It could be, : of course.
|
r*********r 发帖数: 3195 | 25 还是不要看的好. 惨不忍睹. 到了关键处就 native method 了.
回过头还得看它的 c/c++ 代码. |
z*****a 发帖数: 3809 | 26 为什么要用Java?
In
【在 w***g 的大作中提到】 : 一点点数据就out-of-memory了,ft。一个int数组,ArrayList偏偏不支持int,要用In : teger对象,开销一下子增加三四倍。简直就是傻B。4G的内存都不够干个P的。辛辛苦 : 苦编了好几天的程序没法用了,可能要退回fortran了。 : 不知道怎么办才好了...
|
k*****c 发帖数: 1670 | 27 就是啊,用C/C++,多简单。
【在 r*********r 的大作中提到】 : 用 c++.
|
t********e 发帖数: 880 | 28 java generics are so much inferior to c++ templates |
d****p 发帖数: 685 | 29 En, in C++ std::vector is almost as efficient as raw array.
Also, seems there is no way to disable array boundary check in Java?
【在 t********e 的大作中提到】 : java generics are so much inferior to c++ templates
|
h*****0 发帖数: 4889 | 30 int[] buffer
长度不够时
int[] oldBuffer = buffer;
buffer = new int[newLength];
copy oldBuffer to buffer
java数组是动态new的,又不是声明多长是多长,怕什么长度不够?
【在 d****p 的大作中提到】 : 楼主都说了int[]是静态的长度不能变.
|
|
|
h*****0 发帖数: 4889 | 31 这种计算程序在这里有效率问题,当然就应该自己根据需要写一个
a
【在 d****p 的大作中提到】 : Interesting. Is it efficient? Noticed that it has a beforeInsert function. : If the implementation is aimed at : balancing support for both array and list, I doubt it will be faster than a : hand-written simple int container.
|
h*****0 发帖数: 4889 | 32 不能手动去除。但是编译器会自动优化。
java设计的理念就是安全,结构好,而不太注重效率。
【在 d****p 的大作中提到】 : En, in C++ std::vector is almost as efficient as raw array. : Also, seems there is no way to disable array boundary check in Java?
|
w***g 发帖数: 5958 | 33 期待编译型语言的mapreduce framework出现。不过现在只能凑活着用java了。
【在 d****p 的大作中提到】 : En, in C++ std::vector is almost as efficient as raw array. : Also, seems there is no way to disable array boundary check in Java?
|
w***g 发帖数: 5958 | 34 快发现问题所在了。貌似hadoop给每个mapper task分配的内存一共只有30MB。估计再g
oogle一阵就能解决了。
确实不是java的问题。
In
【在 w***g 的大作中提到】 : 一点点数据就out-of-memory了,ft。一个int数组,ArrayList偏偏不支持int,要用In : teger对象,开销一下子增加三四倍。简直就是傻B。4G的内存都不够干个P的。辛辛苦 : 苦编了好几天的程序没法用了,可能要退回fortran了。 : 不知道怎么办才好了...
|
c**t 发帖数: 2744 | 35 回头好好总结下哈
再g
【在 w***g 的大作中提到】 : 快发现问题所在了。貌似hadoop给每个mapper task分配的内存一共只有30MB。估计再g : oogle一阵就能解决了。 : 确实不是java的问题。 : : In
|
T*******i 发帖数: 4992 | 36 java搞数值计算?
自己找麻烦
In
【在 w***g 的大作中提到】 : 一点点数据就out-of-memory了,ft。一个int数组,ArrayList偏偏不支持int,要用In : teger对象,开销一下子增加三四倍。简直就是傻B。4G的内存都不够干个P的。辛辛苦 : 苦编了好几天的程序没法用了,可能要退回fortran了。 : 不知道怎么办才好了...
|
w***g 发帖数: 5958 | 37 Hadoop源代码中有这么一行
TaskRunner.java: String javaOpts = conf.get("mapred.child.java.opts", "
-Xmx200m");
也就是说如果不设置这个参数的话,每个task最多只有200m内存。再刨掉hadoop本身用
的,也就每个task 30m的样子,远远不够用。把这个参数调大道2000m就不再出错了。
In
【在 w***g 的大作中提到】 : 一点点数据就out-of-memory了,ft。一个int数组,ArrayList偏偏不支持int,要用In : teger对象,开销一下子增加三四倍。简直就是傻B。4G的内存都不够干个P的。辛辛苦 : 苦编了好几天的程序没法用了,可能要退回fortran了。 : 不知道怎么办才好了...
|
g****y 发帖数: 436 | 38 这个数算是magic number?难以相信。
"
【在 w***g 的大作中提到】 : Hadoop源代码中有这么一行 : TaskRunner.java: String javaOpts = conf.get("mapred.child.java.opts", " : -Xmx200m"); : 也就是说如果不设置这个参数的话,每个task最多只有200m内存。再刨掉hadoop本身用 : 的,也就每个task 30m的样子,远远不够用。把这个参数调大道2000m就不再出错了。 : : In
|
w***g 发帖数: 5958 | 39 In general, open source里面龌龊的东西多的去了,能跑起来就谢天谢地了。
【在 g****y 的大作中提到】 : 这个数算是magic number?难以相信。 : : "
|
d*****d 发帖数: 180 | |
|
|
g*****g 发帖数: 34805 | 41 No, obviously it's configurable from the configuration, the
200M is just a default value.
I bet this property is documented in Hadoop docs.
【在 g****y 的大作中提到】 : 这个数算是magic number?难以相信。 : : "
|
g*****g 发帖数: 34805 | 42 Honestly, this is in their cluster setup guide.
http://hadoop.apache.org/common/docs/current/cluster_setup.html
It shouldn't be difficult to find out by googling.
【在 w***g 的大作中提到】 : In general, open source里面龌龊的东西多的去了,能跑起来就谢天谢地了。
|
s********v 发帖数: 288 | 43 -Xmx200m明显是默认的
javaOpts是读配置文件的吧
"
辛苦
【在 w***g 的大作中提到】 : Hadoop源代码中有这么一行 : TaskRunner.java: String javaOpts = conf.get("mapred.child.java.opts", " : -Xmx200m"); : 也就是说如果不设置这个参数的话,每个task最多只有200m内存。再刨掉hadoop本身用 : 的,也就每个task 30m的样子,远远不够用。把这个参数调大道2000m就不再出错了。 : : In
|
n***d 发帖数: 8857 | 44 用c 呀,自己管理内存多爽。
【在 g*****g 的大作中提到】 : No, obviously it's configurable from the configuration, the : 200M is just a default value. : I bet this property is documented in Hadoop docs.
|