标签: objectsize

Mongo =获取单个文档的大小

我遇到了一个奇怪的mongo行为,我想稍微澄清一下......
我的请求很简单:我想在集合中获得单个文档的大小.我发现了两种可能的解决方

  • Object.bsonsize - 一些应该以字节为单位返回大小的javascript方法
  • db.collection.stats() - 其中有一行'avgObjSize',它在数据上产生一些"聚合"(平均)大小视图.它只代表单个文档的平均大小.

  • 当我使用一个文档创建测试集合时,两个函数都返回不同的值.这怎么可能?
    是否存在其他方法来获取mongo文档的大小?

在这里,我提供了一些我执行测试的代码:

  1. 我创建了新的数据库'test'并输入只有一个属性的简单文档:type:"auto"

    db.test.insert({type:"auto"})
    
    Run Code Online (Sandbox Code Playgroud)
  2. 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)

    }

  3. bsonsize函数调用的输出:Object.bsonsize(db.test.find({test:"auto"}))

    481
    
    Run Code Online (Sandbox Code Playgroud)

javascript document objectsize mongodb objectid

68
推荐指数
4
解决办法
6万
查看次数

使用虚方法的C++对象大小

我对虚拟对象大小有一些疑问.

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)

c++ virtual-functions objectsize

26
推荐指数
1
解决办法
6881
查看次数

直接分配给Old Generation的巨大对象的大小

最近我一直在阅读Java中不同代的对象分配.大多数时候,新对象在Eden(Young Generation的一部分)中分配,然后如果满足以下任何条件,它们将被提升为Old Generation.

(1)物体的年龄达到了终点阈值
(2)当从伊甸园(或)另一个幸存者空间(从)复制物体时,幸存者空间(到)已满

但也有一个特殊情况,即在旧世代中直接分配对象,而不是从年轻一代中提升.当我们尝试创建的对象很大(可能是几MB的数量级)时会发生这种情况.


有没有办法知道巨大/巨大物体的大小/限制?我知道G1垃圾收集器的巨大对象标准.我只想知道Java 6之前或之中的大小限制.

谢谢你的时间 :)

java garbage-collection jvm memory-management objectsize

21
推荐指数
3
解决办法
7287
查看次数

为什么压缩的Oops为Object Header提供12个字节

这是在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)

  • 一个klass字
  • 一个标记词

在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)

java objectsize memory-layout

6
推荐指数
1
解决办法
1058
查看次数

有没有办法根据行,列和变量类型猜测data.frame的大小

我期望生成大量数据然后捕获它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)

memory r objectsize

5
推荐指数
1
解决办法
8176
查看次数