特定文件处理需要的数据结构选择 - java

时间:2013-06-04 13:58:18

标签: java performance data-structures file-io

我查找了类似于我的问题,但我正在寻找Java内置数据结构约束下的最佳解决方案。

我有两个纯文本文件。虽然file1有一个用户名列表,但file2有来自这些用户和其他用户的推特帖子。推文帖子只是作为文本中的纯文本推送。

对于每个用户,如果有帖子,我必须提取帖子中使用的所有不同的主题标签 (假设主题标签是整数,每个帖子都限制在一行)。

这是我选择的数据结构

Map<String, LinkedHashSet<Integer>> usernames = new HashMap<>();

我解决问题的方法

  1. 读取file1以填充用户名键,将默认值设置为null。
  2. 按顺序读取file2,例如post = file2.readLine()
  3. 如果在hashMap键中找到帖子中的用户名,请将帖子中发现的所有主题标签添加到值Set。
  4. 对于一百万用户(f​​ile1)和1000万个帖子(file2),这种方法和数据结构听起来是一种好方法吗?

2 个答案:

答案 0 :(得分:5)

我会说你正在重新发明轮子。当有优秀,快速,有能力,成熟,健壮且免费的Java关系数据库可用时,为什么要担心自己制作内存关系数据模型。

如果我这样做,我只需编写一个程序来读取文本文件中的数据,然后将数据插入到我的数据库中。我推荐HSQLDB。如果与单独使用的JDBC驱动程序一起使用,Apache Derby也可以像SQLite一样使用。

RDBM负责为您进行搜索,存储和数据映射。它可能会比您尝试自行推出的任何解决方案更强大,更高效。

如果我在这个项目中使用HSQLDB,那么我写的DDL看起来像这样:

CREATE CACHED TABLE Users (
    user_id       INTEGER       GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    :
    :

};

CREATE CACHED TABLE Tweets (
    tweet_id      INTEGER       GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    user_id       INTEGER       NULL,
    :
    :

    CONSTRAINT    twe_fk_user   FOREIGN KEY ( user_id ) REFERENCES Users ( user_id )
);

CREATE CACHED TABLE Tags ( 
    tag_id      INTEGER         GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
    :
    :

);

CREATE CACHED TABLE Tweet_Tag_Bridge (
    tweet_id     INTEGER       NULL,
    tag_id       INTEGER       NULL,

    CONSTRAINT   bridge_pk     PRIMARY KEY ( tweet_id, tag_id ),
    CONSTRAINT   brid_fk_twe   FOREIGN KEY ( tweet_id ) REFERENCES Tweets ( tweet_id ),
    CONSTRAINT   brid_fk_tag   FOREIGN KEY ( tag_id )  REFERENCES Tags ( tag_id )
);

表格推文被映射为与用户具有多对一关系(用户可能有很多推文);和推文通过桥牌表tweet_tag_bridge与标签建立了多对多的关系。在桥接表中使用主键可确保标签对于任何单个推文都是唯一的(即,任何推文都不应包含任何标签)。

答案 1 :(得分:0)

您可能希望使用TreeSet<Integer>而不是LinkedHashSet<Integer> - 它将使用更少的内存(因为它没有加载因子)。