【问题标题】:data structure choice for a specific file processing need - java特定文件处理需求的数据结构选择 - java
【发布时间】:2013-06-04 13:58:18
【问题描述】:

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

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

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

这是我选择的数据结构

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

我解决问题的方法

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

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

【问题讨论】:

标签: java performance data-structures file-io


【解决方案1】:

我会说你正在重新发明轮子。当有优秀、快速、有能力、成熟、健壮和免费的 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 与标签具有多对多的关系。在桥接表中使用主键可确保标签对于任何单独的推文都是唯一的(即,任何推文都不应有多个标签)。

【讨论】:

  • 我理解并感谢您为我设计数据库所做的努力:)。但是要求更多的是一次性处理,并且在使用数据库方面禁止额外的资源。不过还是谢谢。
  • 不用担心......只花了几分钟,这是我的观点的一部分。无论您如何处理您的问题,您都必须解析您的输入并将其存储在数据结构中。尤其是如果这是一次性的事情,您应该使用 Derby 或 HSQLDB ...因为您花在编码数据结构上的时间几乎肯定会比仅使用数据库引擎要多得多。
【解决方案2】:

您可能想要使用TreeSet&lt;Integer&gt; 而不是LinkedHashSet&lt;Integer&gt; - 它会使用更少的内存(因为它没有负载因子)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    相关资源
    最近更新 更多