有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jakarta ee将一个ArrayList对象拆分为大小相等的块,比如Java中的1MB

我有一个ArrayList<MyObject>MyObject由于包含数组,大小可能会有所不同

ArrayList的大小是24MB,我想把它分成每个1MB的块

我不能做24个相等的部分,假设每个部分都是1MB,因为我说过MyObject的大小不是常数

有没有理想的方法把它分成大小相等的块


共 (3) 个答案

  1. # 1 楼答案

    我向您推荐这个库:http://openjdk.java.net/projects/code-tools/jol/,通过它,您可以测量对象的大小,从而测量您的集合。通过几行代码,您可以进行一些大小验证,然后创建一个新集合来插入新元素

    例如,这里有一个标准输出:

    java.util.Hashtable instance footprint:
         COUNT       AVG       SUM   DESCRIPTION
             1        64        64   [Ljava.util.Hashtable$Entry;
             1        48        48   java.util.Hashtable
             2                 112   (total) //<    - Here is your measure
    
  2. # 2 楼答案

    除非java有一些我不知道的隐藏API,否则很难在java中获得对象大小,这可能是不可能的

    你最好的选择可能是根据估计其成员的规模来估计其规模

    为了更好地了解开销:

    • 打造一批(百万?)并将它们放置在一个数组中
    • 连续运行2次垃圾收集
    • 记录当前内存使用情况
    • 删除对该数组的引用,以便系统可以收集它
    • 再运行2到3个地面军事系统
    • 记录当前内存使用情况
    • 减去你的两次录音

    这可能是你能得到的最精确的对象大小,而且在运行时显然是无用的

  3. # 3 楼答案

    TL;DR——务实的解决方案是改变问题

    首先,你说你有一个ArrayList<MyObject>,但是为了找到大小,你把它们当作Object。(或者至少,人们是这样理解你的问题的!)很难找到/估计任意Object的大小

    解决方案:在^{中添加一个方法,根据固定大小和可变大小组件的大小来估计大小

    更困难的是包装。你们的问题(我认为)是Bin Packing Problem的一种形式。获得最优包装是一个NP难问题

    这对你来说意味着,找到一个将24MB的对象最优地打包成24个大小相等的块的方法在计算上是非常昂贵的。在最坏的情况下,这将是难以计算的

    此外,还有一种边缘情况,在这种情况下,解决方案是不可能的;当其中一个对象大于1MB时

    解决方案:通过允许一些块超过大小,或允许更多块来缓解问题。这给了你一些简单的启发式解决方案

    // allow more chunks
    chunkNo = 1
    for object in objectList:
         if object.size() > chunks[chunkNo].remainingSize()
             chunkNo++
         add object to chunks[chunkNo]
    
    // allow oversized chunks:
    sort objectList by object size.
    chunkNo = 1;
    for object in objectList:
         add object to chunks[chunkNo]
         chunkNo++
         if chunkNo > max
              chunkNo = 1
    

    还有其他一些策略可以让你更好地打包。。。以更高的代码/计算复杂性为代价;e、 g.在第一个版本中,尝试将小对象填充到之前的块中,这些块没有填满