需要使用Java搜索一个大的整数文件

需要使用Java搜索一个大的整数文件,java,file,search,memory,Java,File,Search,Memory,我有一个文件,它有100000行,每行是一个由1000个整数(从0到1000000)分隔的空格列表。现在我需要制作一个API,当给定两个输入a和b时,它告诉我在文件的同一行中是否有两个数字,其中b在索引中位于a之后。文件的总大小约为700 MB 由于它是一个API,我不能每次都通过创建流从文件中读取,因为我必须注意响应时间,而且磁盘读取速度很慢。由于文件太大,我无法加载内存中的所有内容 关于什么是最佳方式有什么建议吗 注意-我创建了一个API,将所有内容加载到内存中,制作一个数字->它所属行集的

我有一个文件,它有100000行,每行是一个由1000个整数(从0到1000000)分隔的空格列表。现在我需要制作一个API,当给定两个输入a和b时,它告诉我在文件的同一行中是否有两个数字,其中b在索引中位于a之后。文件的总大小约为700 MB

由于它是一个API,我不能每次都通过创建流从文件中读取,因为我必须注意响应时间,而且磁盘读取速度很慢。由于文件太大,我无法加载内存中的所有内容

关于什么是最佳方式有什么建议吗


注意-我创建了一个API,将所有内容加载到内存中,制作一个数字->它所属行集的hashmap,然后尝试搜索它。它适用于较小的文件,但当我尝试用较大的文件启动服务器时,服务器不会启动(我也是JAVA新手,有人能帮助我在哪里查看为什么不启动的日志吗?。我只是在bash脚本中执行JAVA-jar$DIR/target/test.jar)

我想这里有很多数字(100M)如果你想把它们都保存在内存中,你应该准备使用Gbs的ram。好消息是,最高的数字是1百万,这使得很多数字重复出现

我可能会用图表来表示这个文件。每个节点都包含一个数字(1-1000000),因此您有100万个节点,可以快速索引以进行O(1)访问(节点可以很容易地实现为数组的单元)。然后,如果在文件的任何一行中,Y出现在X的右侧,则每个节点X都连接到一个节点Y

解决方案包括在图中找到两个节点的连通性。我不是这里的专家,我会实现一个类似dfs的算法,注意避免循环。由于避免了这种情况,查找算法将最多接触100万个节点,从而降低了复杂性

关于空间:每条线路应产生999个连接,即(乘以100k条线路)=近1亿个连接。如果每个连接有4个字节(但您可以改进,因为您只需要20位就可以存储100万个字节),那么您就有400 MB的内存用于连接


因此,使用400Mb的ram,您可以使API的响应速度非常快。

700MB太大了?当服务器不启动时会出现什么错误?如果这是一条内存不足的消息,您可能只需为其分配更多内存即可解决问题,除非您预见到这些文件将变得更大(比如超过几GB)。我假设上限为一百万。不均匀的逗号分组是印度特有的怪癖,我正在编辑以反映标准用法。另外,对于内存使用来说,一个包含两个整数对象的哈希映射对于键和值来说并不是非常理想的。您可能希望研究如何使用使用使用标准int而不是objects:的本机java集合,但是这是一个有点高级的主题。@john16384如果编程方法很小、不雅且处理不当,那么即使7 MB也是相当大的。首先感谢您宝贵的输入。我也会这样做,但问题是数据驻留在文件中。创建图形本身需要很多时间。只有将图形预加载到内存中的某个位置(可能是redis或某些graph DB,如neo4js),才能认为此解决方案是优化的。但由于我必须从文件中读取它(这是一个限制),所以这个解决方案可能无法工作。事实上,如果允许预加载,我可以创建一个散列,其中key是数字之一(1-1000000),&value是一个包含该数字所在的所有行的集合。等等-你说你尝试预加载没有成功,不是说不允许。如果允许的话,你应该这样做:不管需要多少时间初始化(也要考虑保存图结构StUnt,一旦被构建为输入文件的替换,以便进一步更快的预加载)。您提出的解决方案(数字->#行的hashmap)具有更高的内存消耗,这可能会导致您在原始帖子中所述的预加载失败。请对您尝试的解决方案进行评论:使用数字1-1M的hashmap并不是基于索引的数组的最佳解决方案(因此,空间为n,访问量为1)。与“设置为值”相同,因为您将使用此作为列表。除此之外,即使使用数组而不是map/set(并优化空间),在索引查找之后仍然需要读取文件;杰克,如果我的内存中已经有了映射,那么在索引查找之后我就不需要读取文件了。创建图形并保存该构造也需要相同的内存量(节点和边都需要)。如果我错了,请纠正我。很抱歉,是您设置了严格的限制“不能每次读取文件”和“不能加载内存中的所有内容”。让我们进行一场连贯的辩论。如果您没有内存限制,理想的做法是使用1Mx1M位映射(15Gb的ram)。如果你有限制,就要连贯地处理它们。不想读取文件?使用图表。你有足够大的内存,但不是很大?拿着地图-(中间空间,非常快)。可以在内存中保存文件还是可以读取?行索引很好。它是最优的吗?可能不会。