Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java调用shell命令不好吗?_Java_Shell_Bloom Filter - Fatal编程技术网

从Java调用shell命令不好吗?

从Java调用shell命令不好吗?,java,shell,bloom-filter,Java,Shell,Bloom Filter,我需要在Java中使用两个文件的差集。每个文件大约有5000万行,所以我无法将它们完全加载到内存中。我可以在这几个阶段完成,但我计划使用linux中的comm命令,这样做效率很高 java中是否有一个库可以有效地完成这项工作 从程序中调用shell命令是一种糟糕的设计吗 详细信息 我有file1和file2,它们都有超过4000万行。我不想把它们记在记忆里。我需要找到file1-file2的设置差异。i、 e.在文件1中但不在文件2中的行。一般来说,我会遵循以下算法: 1. Read file

我需要在Java中使用两个文件的差集。每个文件大约有5000万行,所以我无法将它们完全加载到内存中。我可以在这几个阶段完成,但我计划使用linux中的
comm
命令,这样做效率很高

  • java中是否有一个库可以有效地完成这项工作
  • 从程序中调用shell命令是一种糟糕的设计吗
  • 详细信息

    我有file1和file2,它们都有超过4000万行。我不想把它们记在记忆里。我需要找到file1-file2的设置差异。i、 e.在文件1中但不在文件2中的行。一般来说,我会遵循以下算法:

     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 filter给出了近似的答案,但我认为位集长度足够长*(14*文件大小1,即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
    

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

    使用shell脚本会给应用程序增加额外的依赖性,也可能使应用程序平台依赖性。例如,在没有通信的操作系统上

    您是否尝试过
    InputStream
    处理这些文件?它不会将整个内容加载到内存中。如果
    comm
    满足了您的需要,这意味着您只需要逐行进行diff,您可以尝试
    InputStream


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

    没有更多上下文,这个问题是离题的,因为它需要外部库或主要基于意见的答案。我正在编辑这个问题。谢谢您的回答。但是我不明白这会有什么帮助。我需要设置差异,即文件1中的所有行,但不在文件2中。我可以想到的一种方法是“在Hashset中读取file1的一块”并与file2的每一行进行比较。对文件1中的所有块重复它,我实际上计划使用'sort | comm-12'@MangatRaiModi
    comm
    逐行比较文件。如果您想做同样的事情,可以尝试
    InputStream
    。并行读取两个文件,逐行比较,如果发现差异,则输出/保存。。否则什么也不做。最糟糕的情况是,这两个文件完全不同,那么你需要考虑如何存储比较结果。但是如果文件没有像?MangatRaiModi那样排序,那就不行了。我不知道你的要求。排序大文件是另一个问题。做一些谷歌搜索,你会找到答案。谢谢你的帮助。然而,我已经决定使用布卢姆过滤器。