我将 SQL 查询的Arraylist<Hashtable<String, String>>
结果存储到 Hashtable 中,每个结果都存储在 Hashtable 中,然后每个结果都存储在列表中
如果结果少于 100.000 个,则它可以正常工作,如果我得到更多结果和 OutOfMemory 异常,则为 buf。
你对我如何改善这种情况有什么建议吗?
您可能可以通过使用自定义类来表示每一行来节省一些空间。(AHashMap
是一个相当“内存消耗”的数据结构。)然而,这只会推迟不可避免的 OOME。
一个更好的主意是更改您的应用程序,这样您就不必将整个结果集存储在内存中。
改善这一点的最简单且可能占用内存最少的方法是为您的数据保留一个二维数组:
String[][] data;
// Alternatively, if you prefer lists:
List<String[]> data;
然后,您只需要一个额外的数据结构,例如
Map<String, Integer> fieldNameToIndexMapping;
...您将在其中存储查找表以按列索引访问您的字段。例如
String value = data[row][fieldNameToIndexMapping.get("MY_COLUMN")];
在适当的情况下,通过使用更简洁的数据类型可以进行更多调整。我怀疑String
您存储在数据结构中的某些值实际上是Boolean
,Integer
以及其他更容易以非字符串形式存储的项目。
有几种不同的方法。Stechen C 是正确的,最好在 SQL 中使用“where”子句来减小结果集的大小。
如果您使用缓存,您可以设置缓存的最大大小,最好的类是 LinkedHashMap。有一个 Map 的实现可以保持插入顺序。您需要对其进行子类化并覆盖 removeEldestEntry() 方法,如 Javadoc 中所示: