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

标签 java performance data-structures file-io

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

我有两个纯文本文件。 file1 具有用户名列表,而 file2 具有这些用户和其他用户的 Twitter 帖子。 Twitter 帖子只是以纯文本形式插入文件中。

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

这是我选择的数据结构

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

我解决问题的方法

  1. 读取 file1 以填充用户名键,将默认值设置为 null。
  2. 按顺序读取 file2,例如 post = file2.readLine()
  3. 如果在 hashMap 键中找到帖子中的用户名,请将帖子中所有发现的主题标签添加到值 Set 中。

对于 100 万用户(文件 1)和 1000 万个帖子(文件 2)来说,这种方法和选择的数据结构听起来像是一个好方法吗?

最佳答案

我想说你是在重新发明轮子。当有优秀、快速、强大、成熟、健壮且免费的 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被映射为与用户具有多对一的关系(一个用户可能有很多条tweets);推文通过桥接表 tweet_tag_bridge 与标签建立多对多关系。在桥接表中使用主键可确保任何单个推文的标签都是唯一的(即任何推文都不应具有多个标签)。

关于java - 特定文件处理需求的数据结构选择 - java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16919815/

相关文章:

java - JPA 中的多个唯一约束

Java 与数据库存储对象的并发

mysql - 使用 GROUP BY 查询会变慢

swift - 核心数据 : Setting the Related Object Takes Too Long

c++ - 最快的 C++ 有理数库

algorithm - BK - 树搜索所有

java - 从文件路径构建树,我的逻辑正确吗?

java - 使用 GSON 从 ClassLouder 类反序列化通用类型

java - 如何在 JPA 中正确保持多对多关系

python - 用于合并和展平树结构的集合合并