gpt4 book ai didi

java - 如何在临时本地存储中存储数百万个条目

转载 作者:搜寻专家 更新时间:2023-10-30 21:56:08 24 4
gpt4 key购买 nike

我正在进行一项将数百万条数据从一个数据库迁移到另一个数据库的工作。在第一个数据库中,我有两个不同的表(我可以将其作为下载的文本文件访问 - 我无法正确访问数据库)(1) Cities - 其中每一行都是一个 City 对象,实例变量由制表符分隔(例如 id name population )

(2) CitiesToTopics - 其中每一行都是一个城市 ID 和一个相应的主题(例如 id topic)。这不是每行唯一的。所以,2行可以共享一个id,意味着对应的城市有2个主题[topic1, topic2]。

在这次迁移中,我将创建一个名为 City 的新 POJO,它具有

public class City {
private long id;
private String name;
private long population;
private List<String> topics;
// removed getters and setters
}

并将这些城市添加到我的新数据库中。

我想先查询 CitiesToTopics 表并创建一个

HashMap<String, List<String>> citiesToTopics它映射每个 id -> List[topic]。

然后,查询第二个表,对于每一行,取 id 并执行 List<String> topics = citiesToTopics.get(id)然后创建 City(id, name, population, topics) .

除了 CitiesToTopics 中有超过 26 万个城市和大约 1.5 亿个条目之外,这一切都很好。因此,当我尝试运行该程序时,我不断收到内存错误或 GC 错误。我已经升级到 fastutil hashmap但我收到“Java 运行时环境检测到 fatal error ”。我不能真正使用外部数据库来存放我的临时 citiesToTopics,因为 SQLite 可以执行大约 950 次插入/秒,这在我的例子中意味着将需要大约 2 天的时间来运行。有没有更好的方法来处理如此多的数据,尤其是当它实际上只是确保每个城市获得其适当主题的临时方法时?

提前致谢

编辑: 必要的按摩 - 这就是我需要创建临时数据结构的原因 - 是采用具有 id topic 的行作为字符串,将行拆分为 \t并将其放入 map 中。然后,取一条有 id name population 的线, 被 \t 分割, 创建一个新的 JSONObject这将是 {"Id": "97987987", "name": "Boston", "Population": "673,184", "Topics": ["summer", "winter"]}。

最佳答案

你可以做的是:

  • 按 id 对这两个文件进行排序。例如,在 Linux 上,您可以使用类似 cat file | sort -k1 > sorted_file(未测试)这可能会在合理的时间内完成此操作(较大的文件需要几个小时,但不是几天)
  • 以同步的方式遍历一次城市和主题文件,现在您知道所有记录都已排序,并以 N 个城市为一批处理填充您的新数据库。您不需要比批处理大小更多的内存。

关于java - 如何在临时本地存储中存储数百万个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48307564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com