从Java调用shell命令不好吗?
我需要在Java中使用两个文件的差集。每个文件大约有5000万行,所以我无法将它们完全加载到内存中。我可以在这几个阶段完成,但我计划使用linux中的从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
comm
命令,这样做效率很高
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'@MangatRaiModicomm
逐行比较文件。如果您想做同样的事情,可以尝试InputStream
。并行读取两个文件,逐行比较,如果发现差异,则输出/保存。。否则什么也不做。最糟糕的情况是,这两个文件完全不同,那么你需要考虑如何存储比较结果。但是如果文件没有像?MangatRaiModi那样排序,那就不行了。我不知道你的要求。排序大文件是另一个问题。做一些谷歌搜索,你会找到答案。谢谢你的帮助。然而,我已经决定使用布卢姆过滤器。