我有两个文件,all.txt(525,953,272 条记录)和subset.txt(525,298,281 条记录)。每条记录只不过是一个 17 位的 ASCII 整数。两个文件都已排序,每个文件中的重复记录已被删除。subset.txt 中的每个值也存在于all.txt 中。我希望能够找到的记录全部.txt不在subset.txt。
我试图diff
在这两个文件之间运行 a ,认为它会写出all.txt 中的行,但不是subset.txt 中的行。该机器有64GB的内存。在diff
已经运行了一个半小时,目前已获得有关内存的75%。
任何人都可以推测可能会发生什么,以及是否有论据diff
可能会有所帮助?这难道不是diff
我应该做的,我应该使用不同的方法吗?
我需要实现一个锁定方案,以便多个进程可以共享一组资源,而“特殊”进程可以获得对该组资源的独占访问。
这些是批处理过程:在每个事务的开始,我建议获取适当的锁,并在最后释放它,无限期。
flock
具有我需要的语义(LOCK_SH、LOCK_EX、LOCK_UN)。我使用 Perl Flock.pm 和一个虚拟文件对其进行了试验,该文件的唯一目的是被flock
'ed 反对。我对它的速度有多慢感到有些惊讶,而且从时间花费的“顶部”看并不明显。(它不受 CPU 限制,即使正在执行的循环只包含 LOCK_SH 和 LOCK_UN。)我不想为过早优化感到内疚,但我想知道是否flock
是管理共享和的标准方法独占访问 *nix 中的共享资源,即使共享资源不是实际文件,或者是否存在我不知道的其他设施。
更新:@msw 正确地猜到我(无意中)锁定了 NFS 文件而不是本地文件。使用本地文件完全消除了我看到的性能损失。我将问题悬而未决,以了解有关“文件锁定”是否真的是解决此类问题的最佳方法的更多信息。
这是我的制表符分隔文件 t.tsv:
\n$ cat t.tsv\n2022/05/05 -258.03\n2022/05/07 -18.10\n2022/05/09 -10.74\n2022/05/09 -132.60\n2022/05/12 -18.56\n2022/05/12 -20.20\n2022/05/17 -11.00\n2022/05/17 -112.91\n2022/05/17 -51.43\n2022/05/17 -64.78\n2022/05/18 -13.96\n2022/05/18 -13.96\n2022/05/18 -7.51\n2022/05/19 -17.08\n2022/05/20 -33.08\n
Run Code Online (Sandbox Code Playgroud)\n我正在使用 MacOS 12.4 排序(来自手册页:排序实用程序符合 IEEE Std 1003.1-2008 (\xe2\x80\x9cPOSIX.1\xe2\x80\x9d) 规范)首先按 alpha seq 中的第 1 列进行排序升序,然后按数字升序排列 col2。
\n$ cat t.tsv|sort --field-separator='\\t' --key=1,1 --key=2,2n\n2022/05/05 -258.03\n2022/05/07 -18.10\n2022/05/09 -10.74\n2022/05/09 -132.60\n2022/05/12 -18.56\n2022/05/12 -20.20\n2022/05/17 -11.00\n2022/05/17 -112.91\n2022/05/17 -51.43\n2022/05/17 -64.78\n2022/05/18 -13.96\n2022/05/18 -13.96\n2022/05/18 -7.51\n2022/05/19 -17.08\n2022/05/20 -33.08\n
Run Code Online (Sandbox Code Playgroud)\n我很困惑为什么当第一列相同时第二列没有按升序排序。许多 SE 对同一问题的回答都说 (a) 您将单个列指定为--key=1,1
,并且 (b) 您可以应用诸如-n
单个键定义之类的选项--key=2,2n
。
更新:我应该提到我的外壳是 …