我有一个有100,000行的文件,每行是一个空格列表,分隔1000个整数(范围从0到1,000,000)。现在我需要创建一个API,当给出两个输入时a和b告诉我文件中的同一行中是否存在两个数字,其中b在索引之后。文件总大小约为700 MB。
由于它是一个API,我无法通过创建流来每次从文件中读取,因为我必须处理响应时间并且磁盘读取速度很慢。而且由于文件太大,我无法将所有内容加载到内存中。
关于什么是最佳方式的任何建议?
注意 - 我通过将所有内容加载到内存并创建数字的哈希图来创建API - >它所属的行集,然后尝试搜索它。它适用于较小的文件,但是当我尝试使用较大的文件启动服务器时,服务器无法启动(我也是JAVA的新手,任何人都可以帮我在哪里查看日志,为什么它没有启动?。我我只是在我的bash脚本中执行java -jar $ DIR / target / test.jar)
答案 0 :(得分:0)
我想在这里你有很多数字(100M),如果你想将它们全部留在记忆中,你应该准备使用ram的Gbs。好消息是最高的数字是1M,因此重复了很多数字。
我可能用图表代表该文件。每个节点包含一个数字(1-1000000),因此您有100万个节点,快速索引O(1)访问(节点可以很容易地实现为数组的单元格)。然后,如果Y出现在文件的任何一行的X右侧,则每个节点X连接到节点Y.
解决方案涉及在图中查找两个节点的连接。我不是这里的专家,我会实现类似dfs的算法,注意避免循环。由于这种避免,寻找算法将触及最多100万个节点,使复杂性降低。
关于空间:每行应产生999个连接,即(乘以100k行)=几乎1亿个连接。如果每个连接是4个字节(但你可以改进,因为你需要的是20位来存储100万个),那么你有400Mb的内存用于连接。
因此,使用400Mb的ram,您可以非常快速地回答API。