将 HashMap 逐个保存到文件
Posted
技术标签:
【中文标题】将 HashMap 逐个保存到文件【英文标题】:Saving a HashMap piece by piece to File 【发布时间】:2019-09-03 15:39:30 【问题描述】:我正在 Java 中运行一个大循环,其中,在每一次传递中,数据都填充到 HashMap 中。 循环很长,所以我无法将完整的 HashMap 保存在内存中。所以我需要找到一种方法,在每 1000 次左右迭代后将 Hashmap 导出到文件中。
我正在考虑在每 1000 步后使用序列化将 HashMap 导出到文件,清除 HashMap 变量并通过将下一个附加到同一文件来重复该过程。但是在从文件中检索完整的 HashMap 时会出现问题,因为每次导出时都会将元数据附加到文件中。那么有没有其他方法可以做到这一点?
编辑: HashMap结构如下:
HashMap<Key, double[]>
Key
String name;
BitSet set;
【问题讨论】:
如果您进行序列化,您需要哪些元数据? 不断增长的 Map 的目的尚不清楚,但假设每个循环都需要它,请考虑使用数据库(而不是文件)来保存键/值。也许有一个 LFU 缓存,以避免在每个循环中访问数据库。 @alainlompo 如果我序列化并保存,我每次都需要保存到一个新文件中。如果我继续附加到同一个文件,我只能检索第一个对象。我假设这是因为在第一次保存时,一些元数据附加到文件的开头,表明该文件包含一个 HashMap。 【参考方案1】:是的。您有一个很棒的想法,即每 N 次迭代清除一次文件,这看起来类似于:
public void exportHashTable()
HashMap<String, Object> map = new HashMap<>();
map.put("hi", "world");
for (int i = 0; i < map.size(); i++)
// Some logic ..
if (i % 1000 == 0)
appendToFile(map);
map.clear();
为了导入你不必阅读整个文件,而是逐行阅读,以防你导出它(而不是序列化它)。假设您将其导出为CSV
甚至可能是JSON
。在这种情况下,您可以导入 HashMap 并处理 N 行,然后清除并继续进行。
public void importHashTable()
try (BufferedReader br = new BufferedReader(new FileReader(file)))
String line;
while ((line = br.readLine()) != null)
// process the line, add to hashmap or do some other operation
【讨论】:
是的,但我的问题是,如何实现 appendToFile?因为使用序列化不起作用。 Java 中是否有一些函数可以将 HashMap 导出为 CSV 或 JSON? (无需下载任何新库) 是的,有一些库可以将对象转换为 JSON(Jackson 和 Gson),还有一些库可以像 Apache Commons 一样创建 CSV。不幸的是,您没有提供我用来向您展示示例的任何您正在保存的对象,但是,如果您编辑帖子并向我提供您尝试保存的对象的示例并在 cmets 中向我询问此答案我很乐意这样做。 添加示例以上是关于将 HashMap 逐个保存到文件的主要内容,如果未能解决你的问题,请参考以下文章
Java Spark 如何将 JavaPairRDD<HashSet<String>, HashMap<String, Double>> 保存到文件中?