pra*_*nay 2 java performance file-io data-structures
我查找了类似于我的问题,但我正在寻找在java内置数据结构的约束下的最佳解决方案.
我有两个纯文本文件.虽然file1有一个用户名列表,但file2有来自这些用户和其他用户的推特帖子.Twitter帖子只是作为文本中的纯文本推送.
对于每个用户,如果存在帖子,我必须提取帖子中使用的所有不同的主题标签(假设主题标签是整数,每个帖子被限制在一行).
这是我选择的数据结构
Map<String, LinkedHashSet<Integer>> usernames = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
我解决问题的方法
这种方法和数据结构对于一百万用户(file1)和1000万个帖子(file2)来说听起来像是一个好方法吗?
我会说你正在重新发明轮子.当有优秀,快速,有能力,成熟,健壮且免费的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 )
);
Run Code Online (Sandbox Code Playgroud)
表格推文被映射为与用户具有多对一关系(用户可能有很多推文); 和推文通过桥牌表tweet_tag_bridge与标签建立了多对多的关系.在桥接表中使用主键可确保标签对于任何单个推文都是唯一的(即,任何推文都不应具有多个标签).