【问题标题】:How to read two big text files in one Hash Map [closed]如何在一个哈希图中读取两个大文本文件 [关闭]
【发布时间】:2018-06-18 03:01:39
【问题描述】:

我有两个像

这样的文本文件
     file1. txt                file2.txt

  http://example.com       http://example.com
  http://example.com       http://example.com

我想逐行读取这两个文件并比较两者的输出。 就像 file1 的 line1 输出和 file2 的 line1 输出一样

如果这两个文件有数百万行,我们如何才能有效地读取它们。

我们可以使用 java lambda 表达式吗?

【问题讨论】:

  • 我不想检查重复项,我想以一种方法传递文件 1 的第 1 行和文件 2 的第 1 行,并且在某些过程之后想要返回结果。
  • 尝试类似:File f1 = new File("file1.txt"); File f2 = new File("file2.txt"); boolean areEqual = FileUtils.contentEquals(f1, f2);
  • “我不想检查重复” - 然后告诉我们你想做什么,确切地说。
  • 您知道向数百万个网站发送GET 请求需要多长时间吗?

标签: java file data-structures lambda time-complexity


【解决方案1】:
private static <R> List<R> compare(Path path1, Path path2, BiFunction<String, String, R> compare) throws IOException
{
    List<R> list = new ArrayList<>();
    try (Stream<String> s1 = Files.lines(path1);
         Stream<String> s2 = Files.lines(path2))
    {
        Iterator<String> itr1 = s1.iterator();
        Iterator<String> itr2 = s2.iterator();
        //compare only till both the files have some entry
        while (itr1.hasNext() && itr2.hasNext())
        {
            list.add(compare.apply(itr1.next(), itr2.next()));
        }
    }
    return list;
}

【讨论】:

  • 谢谢。我正在寻找这样的解决方案
  • 对于那些好奇的人,Files#lines 会延迟填充Stream,因此不会加载整个文件。这种方法的使用非常有效。
【解决方案2】:

没有特别有效的方法。你能做到的最好的:

// pseudo-code
file1 = open(...)
file2 = open(...)
while (file1 not at EOF) {
    url1 = file1.readLine()
    url2 = file2.readLine()
    if (url1 != url2) {
        connection1 = open(url1)
        connection2 = open(url2)
        // deal with "error" responses
        if (connnection1.contentLength != connection2.contentLength) {
            // not same
        } else {
            // compare bytes for connection output streams)
        }
    } else {
        // same
    }
}

上面的代码中有几个“调整”:

  1. 如果网址相同,则无需进行比较
  2. 如果或其他 URL 没有“打开”,那么您不应该比较它们
  3. 如果内容长度不同,您可以跳过比较它们
  4. 如果文档不相等,您可能只需要阅读其中的一部分。

您还可以通过并行进行一些比较来获得加速。风险在于您将不堪重负您的网络或远程服务器,或者受到远程服务器的速率限制或阻止。


如果这两个文件有数百万行,我们如何才能有效地读取它们。

如果您确实需要比较文档,那么要比较数百万个 URL 将需要很长时间。限制因素将是网络(带宽、延迟、拥塞等)或远程服务器的性能。

我们可以使用 java lambda 表达式吗?

它不会对性能产生明显影响。

【讨论】:

  • 什么是内容长度?
  • @shubhambansal 如果从GET 请求接收到的内容有不同的Content-Length 参数,则无需检查消息是否相等——它们的长度不同且不可能相等。跨度>
  • @shubhambansal - 它记录在 HTTP 规范中......以及您将使用的 Http 客户端 API 的 javadocs。
  • 补充一点,如果两个请求有可能有不同的Content-Lengths,但在语义上是相等的,那么这个检查就不能执行。
  • 这取决于确定两个文档相同的精确标准。我假设每个字节都是相同的,但是对于某些用例来说这可能太严格了。但是,如果你开始进入“语义平等”的兔子洞,问题就会变得更加复杂......而且昂贵/缓慢。
【解决方案3】:

您的问题听起来很简单。总体思路是:

open file1
open file2
while not (end of file1 or end of file2)
    read response from file1
    read response from file2
    compare response1 and response2
end while
close file1
close file2

这样,您只需随时将两个响应保存在内存中。文件中有多少响应并不重要。

【讨论】:

    猜你喜欢
    • 2013-02-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2014-03-08
    • 2017-07-02
    • 1970-01-01
    相关资源
    最近更新 更多