【问题标题】:Is it bad to call shell commands from Java? [closed]从 Java 调用 shell 命令是不是很糟糕? [关闭]
【发布时间】:2015-10-14 18:48:10
【问题描述】:

我需要在 Java 中使用两个文件的设置差异。每个文件大约有 5000 万行,所以我无法将它们完全加载到内存中。我可以完成这些阶段,但我计划使用来自 linux 的 comm 命令,它可以有效地做到这一点。

  1. java 中是否有一个库可以有效地完成这项工作?
  2. 从程序中调用 shell 命令是不好的设计吗?

详情

我有 file1 和 file2 每个都有超过 4000 万行。我不想把它们放在记忆中。我需要找到file1 - file2的设置差异。即在 file1 但不在 file2 中的行。一般来说,我会遵循算法:

 1. Read file1 line by line and save it in HashSet.
 2. Read file2 line by line.
 3. Remove each line of file2 from Hashset if present

有什么方法可以在不将 file1 保存在 Hashset 中的情况下做到这一点。

编辑:我的解决方案

我终于决定使用bloom来解决这个目的。我知道布隆过滤器给出了近似的答案,但我已经将位集长度足够长*(14*file1 的大小,即 1000 万)*,这给了我 10^-9 的精度。以下是算法

 1. Read each line of file2 and add to Bloom Filter.
 2. Now, file2 is compressed from 300MB+ to 40MB+
 3. Read each line of file1, if not present in filter print the line

【问题讨论】:

  • 没有更多上下文,这个问题是题外话,因为它要求外部库或主要基于意见的答案
  • 我正在编辑问题。

标签: java shell bloom-filter


【解决方案1】:

1.您可以使用 ProccessBuilder 对象调用 cmd 命令 2.我认为有更有效的方法(批处理文件等)

【讨论】:

    【解决方案2】:

    使用 shell 脚本会给您的应用程序添加额外的依赖项,也可能使您的应用程序依赖于平台。例如。在没有comm 的操作系统上。

    您是否尝试过InputStream 来处理文件?它不会将整个内容加载到内存中。如果comm 做了你需要的,那意味着你只想逐行做差异,你可以试试InputStream

    旁注,如果您要使用comm,您应该确保您的文件已经排序。

    【讨论】:

    • 感谢您的回答。但是我不明白这将如何帮助。我需要设置差异,即所有在 file1 中但不在 file2 中的行。我能想到的一种方法是“在 Hashset 中读取一块 file1”与 file2 的每一行进行比较。对我实际上打算使用 'sort|comm -12' 的所有文件块重复此操作
    • @MangatRaiModi comm 逐行比较文件。如果你想做同样的事情,你可以试试InputStream。您并行读取两个文件,逐行比较,如果发现差异,则输出/保存..否则什么也不做。最坏的情况是,两个文件完全不同,那么你需要考虑如何存储比较结果。
    • 但是如果文件没有像这样排序就行不通了?
    • @MangatRaiModi 我不知道你的要求。排序大文件是另一个问题。谷歌一下,你会找到答案的。
    • 感谢您的帮助。但是我决定使用布隆过滤器。
    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 2022-01-24
    • 2011-10-06
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    相关资源
    最近更新 更多