【问题标题】:Looking for efficient way to store HashMap<key,ArrayList<object>> in SQL寻找在 SQL 中存储 HashMap<key,ArrayList<object>> 的有效方法
【发布时间】:2014-12-04 18:52:21
【问题描述】:

我想用SQL实现下面的HashMap

HashMap<key, ArrayList<posting>>

发布类定义为:

public class Posting {

 public int documentId;
 public double score;

 public Posting(int docId, double scr){
     documentId = docId;
     score = scr;

 }
 }

然后我创建一个名为 hashMap 和列 (keyId,key) 的表。 keyId 是自增 ID。另外,每个key只在hashMap表中插入一次。

然后我创建一个带有名称发布的表。该表的列是(keyId、docId、score)。

你认为这是一种高效的(空间和时间)实现 hashmap 的方式吗?

我的第二个想法是创建一个名为 hashMap 和列(键,postingName)的表,键是主键。 postingName 是包含列(docId、score)的表的名称。 在第二个实现中,我将每个数组列表转换为一个表。

你觉得哪一个效率高?

有没有更好的方法来实现这个hashmap?

请注意,我的 hashmap 的大小非常大。我想存储大约 16.3G 的数据。我只想将我的 HashMap 存储到 Mysql 数据库,然后从数据库中检索数据到 HashMap。

我很欣赏你的想法。

【问题讨论】:

  • key的类型是什么?如果是整数,请勿使用单独的keyId。与直接使用 key 相比,开销是 200%。
  • @Dark Falcon 键的类型是字符串。
  • 您需要它是关系型的吗?也就是说,您是否预计必须对您的数据库运行查询以回答诸如“某某 docId 的平均分数是多少?”、“有多少不同的文档与此键相关联?”之类的问题。等等。如果没有,您最好简单地序列化(和 gzip 压缩)列表,并将其存储为每个键的 blob,使用单个表,如 (key, blob)。如果您确实需要一个关系模式,那么您的设计似乎是合理的。
  • @DarkFalcon 文档的数量是 10000。我希望我可以拥有确实的信息,但请您解释一下您的解决方案。

标签: java mysql sql arraylist hashmap


【解决方案1】:

我认为创建一个包含三列(keyId、docId、score)的表很好。然后您可以使用 select keyid, docid, score from table 检索结果。然后,您可以在源代码中构建哈希表。或者你可以选择 docid, score from table where keyid = 40

【讨论】:

  • 您的建议需要很多空间,因为发布的ArrayList的长度超过10000,并且应该为所有发布写入keyid。
  • 您不必将结果存储在哈希图中。如果您指出您需要的查询,这将有所帮助。例如,如果您想打印所有结果,您可以在按 keyid 排序的表中读取并打印出来而不存储任何内容。如果你只想要一个 keyid,那么你可以只读取那个。最后 10000 个整数只占用 40K,这不是那么大。但很可能您不需要存储地图。
  • 我需要从 sql 读取数据并存储在 hashmap 中,因为我只使用 sql 来存储我的数据而不是文件。
  • 如果你澄清你想要做什么会很有帮助。
猜你喜欢
  • 2012-06-30
  • 2021-07-15
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
相关资源
最近更新 更多