针对特定文件处理需求的数据结构选择-java
我查找了与我类似的问题,但我正在寻找java内置数据结构约束下的最佳解决方案 我有两个纯文本文件。file1有一个用户名列表,file2有来自这些用户和其他人的twitter帖子。推特帖子被简单地作为纯文本推送到文件中 对于每个用户,如果存在帖子,我必须提取帖子中使用的所有不同的hashtag (假设hashtag是整数,每个post仅限于一行) 下面是我对数据结构的选择针对特定文件处理需求的数据结构选择-java,java,performance,data-structures,file-io,Java,Performance,Data Structures,File Io,我查找了与我类似的问题,但我正在寻找java内置数据结构约束下的最佳解决方案 我有两个纯文本文件。file1有一个用户名列表,file2有来自这些用户和其他人的twitter帖子。推特帖子被简单地作为纯文本推送到文件中 对于每个用户,如果存在帖子,我必须提取帖子中使用的所有不同的hashtag (假设hashtag是整数,每个post仅限于一行) 下面是我对数据结构的选择 Map<String, LinkedHashSet<Integer>> usernames = ne
Map<String, LinkedHashSet<Integer>> usernames = new HashMap<>();
Map usernames=newhashmap();
我对这个问题的态度
对于一百万用户(文件1)和1000万帖子(文件2),这种方法和选择的数据结构听起来像是一种好方法吗?你可能想使用
树集而不是链接数据库集
——它将使用更少的内存(因为它没有负载系数)。我想说你是在重新发明轮子。既然有优秀的、快速的、有能力的、成熟的、健壮的、免费的Java关系数据库可用,为什么还要担心创建自己的内存中的关系数据模型呢
如果要这样做,我只需编写一个程序,从文本文件中读取数据,然后将数据插入数据库。我推荐HSQLDB。如果与单独可用的JDBC驱动程序一起使用,ApacheDerby也可以像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 )
);
表tweets被映射为与用户具有多对一关系(一个用户可能有多条tweets);tweet通过bridge表tweet_tag_bridge与标签有多对多的关系。在桥接表中使用主键可以确保标记对于任何单个tweet都是唯一的(即,任何tweet都不应该有多个标记).如果您不受内置数据结构的限制,您可以研究番石榴多重地图。我理解并感谢您为我设计数据库所做的努力:)。但要求更多的是一次性处理,并且禁止在使用数据库方面使用额外的资源。尽管如此,还是谢谢你。不用担心。。。只花了几分钟,这是我的观点的一部分。无论如何处理问题,都必须解析输入并将其存储在数据结构中。特别是如果这是一次性的,您应该使用Derby或HSQLDB。。。因为编码数据结构所花费的时间几乎肯定要比使用数据库引擎所花费的时间多得多。