2013-01-13 82 views
1

我存储从SQL查询结果的Arraylist<Hashtable<String, String>>,每个结果都存储在一个Hashtable中,然后将每个结果存储在列表上最佳SQL查询结果存储

它工作得很好,如果有少比100.000的结果,buf如果有更多的结果我得到和OutOfMemory异常。

对于如何改善这种情况,您有任何建议吗?

+2

你是否真的需要一次完成所有的结果?赔率是你可以存储一个有限的数字,当你真正需要时用另一个查询拉出更多。否则通常只是浪费记忆。 –

+0

是的,我这样做,因为我正在从JDBC数据库表中获取信息并将其存储在MongoDB中,所以我需要存储所有信息 – RedEagle

+3

我很困惑 - 为什么你不能将它作为一个多层应用程序来执行?步骤过程?如果你真的在使用另一个数据库上的INSERT查询执行SELECT查询,那么这是将它分开的最佳人选。无论如何,你不可避免地要做这样的事情,除非JDBC数据库表永远不会增长。即使您可以使存储稍微更高效,字符串也很大。你最终会耗尽内存。 –

回答

1

您可以通过使用自定义类来表示每行来节省一些空间。 (A HashMap是一个相当“内存饥饿”的数据结构。)但是,这只是推迟了必然的OOME。

更好的办法是改变你的应用程序,这样你就不必将整个结果集存储在内存中。

+0

自定义类不是一个选项,因为我不知道每个表的结果列。有加载和加载的表格。 – RedEagle

+0

但大概这些表格代表了业务对象。每桌可以有一个班级。无可否认,可能会有很多类,但代码会更易于维护。 – NickJ

+0

如果自定义类不是一个选项,那么'HashMap'是你的最佳选择。 –

0

改善这种最简单的,可能至少内存密集型的方式是保持一个二维数组为您的数据:

String[][] data; 

// Alternatively, if you prefer lists: 
List<String[]> data; 

你会那么只需要一个额外的数据结构,如

Map<String, Integer> fieldNameToIndexMapping; 

...在这里你会第一建立一个查找表,通过列索引访问您的字段。例如。

String value = data[row][fieldNameToIndexMapping.get("MY_COLUMN")]; 

在适当的情况下,可以使用更简洁的数据类型进行更多调整。我怀疑你存储在你的数据结构中的一些String值实际上是BooleanInteger以及其他更容易以非字符串形式存储的项目。