【发布时间】:2013-11-07 13:12:13
【问题描述】:
我有创建和使用集合的代码,例如:
List<Map<String, Object>> tableData;
这个地图列表由 n 个地图填充,每个地图代表数据库中的一行。每一行都表示为字段名称和字段对应的对象之间的映射(在这种情况下类型无关)。可能缺少某些字段。字段数,m 总是远小于行数(n ≈ 10000 × m)。我需要多次重复使用同一个集合来读取所有行,所以我不能只使用某种惰性迭代器。
是否有有效的数据结构来存储它? Guava 提供了一个Table 集合,但这似乎不符合要求。我正在考虑创建一个界面,例如:
interface TableData{
int size();
Map<String, Object> get(int i);
// ... (interators, etc.)
}
然后创建一个使用 Map<String,List<Object>> 的实现,这样我只实例化 m 列表而不是 n 地图,并且仅在需要时动态创建地图,但我想知道是否有更通用的数据结构。
谢谢
【问题讨论】:
-
能否请您说明为什么 Guava Table(例如
HashBasedTable)不适合您?根据stackoverflow.com/questions/1526596,您的内存表大小不是很大,每行拥有 HashMap 与 ArrayList 的开销是一个非常接近 3 的常数因子,您能否提供对内存限制的粗略估计? -
如果数据的总大小为 1-200 MB,则因子 3 不可忽略。我正在尝试探索所有选项。
HashBasedTable的效率还有多少?
标签: java collections guava space-efficiency