将 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 逐个保存到文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将 HashMap 保存到共享首选项?

Java Spark 如何将 JavaPairRDD<HashSet<String>, HashMap<String, Double>> 保存到文件中?

如何从文本文件中读取/加载此HashMap?

Java:如何保存SET 作为HashMap中的值?

Solana Rust 程序 HashMap<string, u64>

HashMap原理 — 扩容机制及存取原理