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

针对特定文件处理需求的数据结构选择-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

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

我有两个纯文本文件。file1有一个用户名列表,file2有来自这些用户和其他人的twitter帖子。推特帖子被简单地作为纯文本推送到文件中

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

下面是我对数据结构的选择

Map<String, LinkedHashSet<Integer>> usernames = new HashMap<>();
Map usernames=newhashmap();
我对这个问题的态度

  • 读取文件1以填充用户名键,将默认值设置为null
  • 按顺序读取file2,类似于post=file2.readLine()
  • 如果在hashMap键中找到帖子中的用户名,请将帖子中发现的所有hashtag添加到值集中

  • 对于一百万用户(文件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。。。因为编码数据结构所花费的时间几乎肯定要比使用数据库引擎所花费的时间多得多。