我遇到了一个奇怪的mongo行为,我想稍微澄清一下......
我的请求很简单:我想在集合中获得单个文档的大小.我发现了两种可能的解决方
在这里,我提供了一些我执行测试的代码:
我创建了新的数据库'test'并输入只有一个属性的简单文档:type:"auto"
db.test.insert({type:"auto"})
Run Code Online (Sandbox Code Playgroud)stats()函数调用的输出:db.test.stats():
{
"ns" : "test.test",
"count" : 1,
"size" : 40,
"avgObjSize" : 40,
"storageSize" : 4096,
"numExtents" : 1,
"nindexes" : 1,
"lastExtentSize" : 4096,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"ok" : 1
Run Code Online (Sandbox Code Playgroud)
}
bsonsize函数调用的输出:Object.bsonsize(db.test.find({test:"auto"}))
481
Run Code Online (Sandbox Code Playgroud)我对虚拟对象大小有一些疑问.
1)虚函数
class A {
public:
int a;
virtual void v();
}
Run Code Online (Sandbox Code Playgroud)
A类的大小是8字节....一个整数(4个字节)加上一个虚拟指针(4个字节)很清楚!
class B: public A{
public:
int b;
virtual void w();
}
Run Code Online (Sandbox Code Playgroud)
B级的大小是多少?我使用sizeof B测试,它打印12
这是否意味着只有一个vptr,即使B类和A类都有虚函数?为什么只有一个vptr?
class A {
public:
int a;
virtual void v();
};
class B {
public:
int b;
virtual void w();
};
class C : public A, public B {
public:
int c;
virtual void x();
};
Run Code Online (Sandbox Code Playgroud)
C的大小是20 ........
似乎在这种情况下,两个vptrs在布局中......这是怎么发生的?我认为两个vptrs一个用于A类,另一个用于B类....所以没有vptr用于C类的虚函数?
我的问题是,关于继承中vptrs数量的规则是什么?
2)虚拟继承
class A {
public:
int a;
virtual void v();
};
class B: virtual …Run Code Online (Sandbox Code Playgroud) 最近我一直在阅读Java中不同代的对象分配.大多数时候,新对象在Eden(Young Generation的一部分)中分配,然后如果满足以下任何条件,它们将被提升为Old Generation.
(1)物体的年龄达到了终点阈值
(2)当从伊甸园(或)另一个幸存者空间(从)复制物体时,幸存者空间(到)已满
但也有一个特殊情况,即在旧世代中直接分配对象,而不是从年轻一代中提升.当我们尝试创建的对象很大(可能是几MB的数量级)时会发生这种情况.
有没有办法知道巨大/巨大物体的大小/限制?我知道G1垃圾收集器的巨大对象标准.我只想知道Java 6之前或之中的大小限制.
谢谢你的时间 :)
这是在Java 6内存模型之后.在32位JVM中,对象的浅大小是
8 bytes (object header) + total of all instance variables + padding (optional)
Run Code Online (Sandbox Code Playgroud)
如果前两个术语没有加到8的倍数,则会有填充.
在64位JVM中,Shallow大小为
16 bytes (object header) + total of all instance variables + padding (optional)
Run Code Online (Sandbox Code Playgroud)
我的理解是这个Object头由2个单词组成(oracle hotspot VM)
在32位JVM上,对象头= 2*32位= 64位=
64位JVM上的8个字节,对象头= 2*64位= 128位= 16个字节
但使用CompressedOops,3低阶位被截断,因此应回8个字节在64位JVM对堆小于32场音乐会
但是当我使用JOL(Java对象布局)测试对象布局时,它显示了12个字节的Object头.
测试代码
public class App {
public static void main( String[] args )
{
System.out.println(System.getProperty("java.version"));
System.out.println(VMSupport.vmDetails());
System.out.println(ClassLayout.parseClass(A.class).toPrintable());
}
}
class A {
int a;
}
Run Code Online (Sandbox Code Playgroud)
产量
1.8.0_05
Running 64-bit HotSpot VM.
Using compressed references with 3-bit shift. …Run Code Online (Sandbox Code Playgroud) 我期望生成大量数据然后捕获它R.我如何通过行数,列数和变量类型来估计data.frame(以及因此所需的内存)的大小.
例.
如果我有10000行和150列,其中120是数字,20是字符串,10是因子级别,我可以期望的数据帧的大小是多少.结果是否会根据存储在列中的数据而变化(如max(nchar(column)))
> m <- matrix(1,nrow=1e5,ncol=150)
> m <- as.data.frame(m)
> object.size(m)
120009920 bytes
> a=object.size(m)/(nrow(m)*ncol(m))
> a
8.00066133333333 bytes
> m[,1:150] <- sapply(m[,1:150],as.character)
> b=object.size(m)/(nrow(m)*ncol(m))
> b
4.00098133333333 bytes
> m[,1:150] <- sapply(m[,1:150],as.factor)
> c=object.size(m)/(nrow(m)*ncol(m))
> c
4.00098133333333 bytes
> m <- matrix("ajayajay",nrow=1e5,ncol=150)
>
> m <- as.data.frame(m)
> object.size(m)
60047120 bytes
> d=object.size(m)/(nrow(m)*ncol(m))
> d
4.00314133333333 bytes
Run Code Online (Sandbox Code Playgroud) objectsize ×5
java ×2
c++ ×1
document ×1
javascript ×1
jvm ×1
memory ×1
mongodb ×1
objectid ×1
r ×1