- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试创建一个网络界面来搜索大量巨大的配置文件(大约 60000 个文件,每个文件的大小在 20 KB 到 50 MB 之间)。这些文件也经常更新(~3 次/天)。
要求:
我调查的内容:
<xml><line number="1">test</line>...</xml>
.更新大约需要 5 分钟,这有点管用,但我们仍然对此不满意。您将如何实现替代方案?
最佳答案
您可能希望调查 GNU idutils工具包。在 Linux 内核源代码的本地副本上,它可以提供如下输出:
$ gid ugly
include/linux/hil_mlc.h:66: * a positive return value causes the "ugly" branch to be taken.
include/linux/hil_mlc.h:101: int ugly; /* Node to jump to on timeout */
从冷缓存重建索引相当快:
$ time mkid
real 1m33.022s
user 0m17.360s
sys 0m2.730s
从热缓存重建索引要快得多:
$ time mkid
real 0m15.692s
user 0m15.070s
sys 0m0.520s
对于我的 2.1 GB 数据,该索引仅占用 46 兆字节 -- 与您的数据相比很小,但这个比率感觉不错。
找到 399 次 foo
只用了 0.039
秒:
$ time gid foo > /dev/null
real 0m0.038s
user 0m0.030s
sys 0m0.000s
更新
Larsmans 很好奇 git grep
在内核源代码上的性能——这是显示 gid(1)
提供了多少性能增益的极好方式。
在冷缓存上,git grep foo
(返回 1656 个条目,远远超过 idutils):
$ time git grep foo > /dev/null
real 0m19.231s
user 0m1.480s
sys 0m0.680s
一旦缓存变暖,git grep foo
运行得更快:
$ time git grep foo > /dev/null
real 0m0.264s
user 0m1.320s
sys 0m0.330s
因为一旦缓存变暖,我的数据集就完全适合 RAM,git grep
非常惊人:它只比 gid(1)
实用程序慢七倍,当然对于交互式使用来说,它的速度已经足够快了。如果所讨论的数据集不能完全缓存(这可能是事情真正变得有趣的地方),那么索引的性能优势是显而易见的。
关于idutils的两个提示:
没有分页。这绝对是一个缺点,尽管根据我的经验,它运行得足够快,可以简单地将搜索结果存储在别处。如果搜索要返回原始数据集的可观百分比,那么存储部分结果肯定会很烦人。
没有 API:没错,没有 API。但是来源是可用的; src/lid.c
函数 report_grep()
获取与输出匹配的文件链接列表。稍微摆弄一下这个功能甚至可以提供分页功能。 (这需要做一些工作。)最终,您将拥有一个 C API,但它可能仍然不理想。但自定义它看起来并不糟糕。
然而,最糟糕的弱点可能是缺少增量数据库更新。如果所有 文件每天更新三次,这没什么大不了的。如果一些 文件一天更新三次,它就是在做不必要的工作。如果一天三次更新少数文件,则必须有更好的解决方案。
关于python - Unix 目录结构的快速、逐行 "grep -n"等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8121142/
我有一个文件 test.log。非常大的日志文件。它有不同级别的日志记录。例如,trace , debug , info , warning和 error . 显然trace级别消息只是高速发送垃圾邮
我正在经历一些事情,发现了我无法理解的事情, grep -v grep 这意味着什么?我知道 -v 开关将选择所有不匹配的行。但为什么是第二个grep? 这是完整的命令: ps -ef | grep
我使用 egrep 输出一些带有平台名称的行: XXX | egrep "i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu
grep退出状态部分报告中的手册: EXIT STATUS The exit status is 0 if selected lines are found, and 1 if not
我试图返回多个字符串的第一次出现,即,我想从以下文本中选择第一次出现 1259、3009 和 1589 的行。 ADWN 1259 11:00 B23 ADWN 3009
我猜它不是 Perl 兼容的正则表达式,因为有一种特殊的 grep具体来说就是 PCRE。什么是grep最相似? grep有什么特别的怪癖吗?我需要知道什么? (我习惯了 Perl 和 PHP 中的
有没有办法让 grep 从与搜索表达式匹配的文件中输出“单词”? 如果我想在多个文件中查找“th”的所有实例,我可以这样做: grep "th" * 但是输出会是这样的(粗体是我写的); some-t
我有许多(近 100 个)大 csv 文件,第一列中有 sellID。我知道某些 sellID 在 2 个或更多文件中重复 2 次或多次。是否可以使用 grep 找到所有重复的 sellID(创建映射
我有一个文件中的文件列表。该列表很大,并且文件名是非标准的:这意味着有些文件包含空格、非 ASCII 字符、引号、单引号... 因此,将庞大的文件列表作为参数传递给 grep 并不是一种选择: 因为我
我想在 shell 脚本中使用 grep 和两个变量 var = match cat list.txt | while read word_from_list; do grep "$word_
我有一个大文件,其中每一行都包含一个子字符串,例如 ABC123。如果我执行 grep ABC file.txt 或 grep ABC1 file.txt 我按预期返回这些行,但如果我执行 grep
当我执行以下 grep 时,我得到的结果我无法向自己解释: host:/usr/local/tomcat > grep '-XX:PermSize=256m' * RELEASE-NOTES:
这个问题在这里已经有了答案: grep recursively for a specific file type on Linux (5 个回答) 关闭4年前。 要在子目录中查找所有带有 .out 扩
有什么方法可以让我在搜索某些东西时使用 grep 忽略某些文件,相当于 svnignore 或 gitignore 的东西?我通常在搜索源代码时使用类似的东西。 grep -r something *
有没有办法让 grep 从匹配搜索表达式的文件中输出“单词”? 如果我想在多个文件中找到“th”的所有实例,我可以这样做: grep "th" * 但是输出会是这样的(粗体是我的); some-tex
我是 awk/sed 的完全菜鸟,所以如果我在这里遗漏了一些明显的东西,请原谅我。 基本上我正在尝试做一个嵌套的 grep,即类似于: grep $value `exim -Mvh $(`exim -
我正在尝试编写下载 node.js source 的脚本和 corresponding SHASUMS256.txt ,校验和,grep OK,不返回任何结果,使用 grep 的 -q 标志成功退出代
在 grep "str"* 这是否意味着 grep 执行 grep 的所有内容? 那么 grep -r "str". 的结果比前一个多 最佳答案 当您运行 grep str * 时,shell 将扩展
我正在尝试 grep 文件以查找匹配项的确切出现,但我也得到了更长的虚假匹配项: grep CAT1717O99 myfile.txt -F -w 输出: CAT1717O99 CAT1717O99
我有一个文件,其中包含我希望通过未指定分析运行的标识符(每行一个)。如果一切运行正常,分析将输出具有相同标识符的另一个列表(不一定按相同顺序)。 然而,事实证明,对某些输入标识符没有进行分析,并且这些
我是一名优秀的程序员,十分优秀!