[英]How to reduce Java List object size based on bytes
我有一个长字符串的Java列表,并且正在使用net.sourceforge.sizeof.SizeOf
尝试查找大小,并将此列表1减小1,直到List对象的总大小小于net.sourceforge.sizeof.SizeOf
50000字节。 我下面的代码性能很差。
import net.sourceforge.sizeof.SizeOf;
List<String> mySuperLongStrings; // this list contains thousands of long strings
Long size = SizeOf.deepSizeOf(mySuperLongStrings);
while (size > Long.valueOf(50000)) {
if (!mySuperLongStrings.isEmpty()) {
mySuperLongStrings.remove(0);
size = SizeOf.deepSizeOf(mySuperLongStrings);
}
}
关于如何做到这一点的任何建议?
由于Size.deepSizeOf(list)
每次都必须迭代整个列表,因此您的算法具有二次运行时复杂性。 如果仅对列表中字符串的大小求和,就可以轻松地将其更改为线性,一旦超过50000字节的限制就立即停止:
public static <T> List<T> sizedSubList(List<T> list, long maxSize) {
long totalSize = 0;
int i = list.size() - 1;
while (i >= 0) {
totalSize += SizeOf.deepSizeOf(list.get(i));
if (totalSize > maxSize) break;
i--;
}
return list.subList(i + 1, list.size());
}
(结果可能比maxSize
稍大,因为此算法未考虑列表对象本身的大小(包括内部存储阵列))。
用法:
List<String> smallList = sizedSubList(largeList, 50000);
请注意,此方法返回的子列表只是原始列表的视图,因此子列表将反映对原始列表的后续修改,反之亦然。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.