我查找了类似于我的问题,但我正在寻找java内置数据结构约束下的最佳解决方案。
我有两个纯文本文件。虽然file1有一个用户名列表,但file2有来自这些用户和其他用户的推特帖子。twitter上的帖子只是简单地以纯文本形式在文件中推送。
对于每个用户,如果存在post,我必须提取post中使用的所有不同的哈希标签(假设哈希标签是整数,每个帖子仅限于一行)。
这是我对数据结构的选择
Map<String, LinkedHashSet<Integer>> usernames = new HashMap<>();
我处理这个问题的方法
这种方法和数据结构是否对一百万用户(file1)来说是一种很好的方法,比如一千万篇文章(file2)?
发布于 2013-06-04 06:08:52
我得说你在重新发明方向盘。当有优秀的、快速的、有能力的、成熟的、健壮的和免费的Java关系数据库可用时,为什么要担心自己建立一个内存中的关系数据模型。
如果要这样做,我只需编写一个程序来读取文本文件中的数据,然后将数据插入我的数据库中。我推荐HSQLDB。如果与单独可用的JDBC驱动程序一起使用,Apache也可与SQLite一样可用。
RDBMs负责搜索、存储和数据映射。它可能比您自己尝试的任何解决方案都更健壮、更有表现力。
如果我要在这个项目中使用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映射为与用户有多对一的关系(用户可能有多个tweet);而tweet通过桥接表tweet_tag_bridge与标记有多到多的关系。桥表中主键的使用确保标记对于任何单个tweet都是唯一的(也就是说,任何tweet都不应该有多个标记)。
发布于 2013-06-04 06:07:04
您可能希望使用TreeSet<Integer>
而不是LinkedHashSet<Integer>
--它将使用更少的内存(因为它没有负载因子)。
https://stackoverflow.com/questions/16919815
复制