jakarta ee将一个ArrayList对象拆分为大小相等的块,比如Java中的1MB
我有一个ArrayList<MyObject>
。
MyObject
由于包含数组,大小可能会有所不同
ArrayList
的大小是24MB,我想把它分成每个1MB的块
我不能做24个相等的部分,假设每个部分都是1MB,因为我说过MyObject的大小不是常数
有没有理想的方法把它分成大小相等的块
你可以在下面搜索框中键入要查询的问题!
我有一个ArrayList<MyObject>
。
MyObject
由于包含数组,大小可能会有所不同
ArrayList
的大小是24MB,我想把它分成每个1MB的块
我不能做24个相等的部分,假设每个部分都是1MB,因为我说过MyObject的大小不是常数
有没有理想的方法把它分成大小相等的块
# 1 楼答案
我向您推荐这个库:http://openjdk.java.net/projects/code-tools/jol/,通过它,您可以测量对象的大小,从而测量您的集合。通过几行代码,您可以进行一些大小验证,然后创建一个新集合来插入新元素
例如,这里有一个标准输出:
# 2 楼答案
除非java有一些我不知道的隐藏API,否则很难在java中获得对象大小,这可能是不可能的
你最好的选择可能是根据估计其成员的规模来估计其规模
为了更好地了解开销:
这可能是你能得到的最精确的对象大小,而且在运行时显然是无用的
# 3 楼答案
TL;DR——务实的解决方案是改变问题
首先,你说你有一个
ArrayList<MyObject>
,但是为了找到大小,你把它们当作Object
。(或者至少,人们是这样理解你的问题的!)很难找到/估计任意Object
的大小解决方案:在^{中添加一个方法,根据固定大小和可变大小组件的大小来估计大小
更困难的是包装。你们的问题(我认为)是Bin Packing Problem的一种形式。获得最优包装是一个NP难问题
这对你来说意味着,找到一个将24MB的对象最优地打包成24个大小相等的块的方法在计算上是非常昂贵的。在最坏的情况下,这将是难以计算的
此外,还有一种边缘情况,在这种情况下,解决方案是不可能的;当其中一个对象大于1MB时
解决方案:通过允许一些块超过大小,或允许更多块来缓解问题。这给了你一些简单的启发式解决方案
还有其他一些策略可以让你更好地打包。。。以更高的代码/计算复杂性为代价;e、 g.在第一个版本中,尝试将小对象填充到之前的块中,这些块没有填满