我想知道是否有任何提示grep尽可能快.我有一个相当大的文本文件库,以最快的方式搜索.我把它们全都小写了,这样我就可以摆脱-i选择了.这使得搜索速度更快.
此外,我发现-F并且-P模式比默认模式更快.当搜索字符串不是正则表达式(只是纯文本)时,我使用前者,后者如果涉及正则表达式.
有没有人有加速的经验grep?也许用一些特定的标志(我在Linux CentOS上)从头开始编译它,以某种方式组织文件或者以某种方式使搜索并行?
我有两个文件,file1.txt和file2.txt. file1.txt有大约14K线,file2.txt约有20亿. 每行file1.txt有一个字段f1,而file2.txt有3个字段,f1through f3,分隔符|.
我想找到的所有行file2.txt那里f1的file1.txt比赛f2中file2.txt(或上线的任何位置,如果我们不想花费额外的时间分割的数值file2.txt).
file1.txt(约14K行,未排序):
foo1
foo2
...
bar1
bar2
...
Run Code Online (Sandbox Code Playgroud)
file2.txt(约20亿行,未排序):
date1|foo1|number1
date2|foo2|number2
...
date1|bar1|number1
date2|bar2|number2
...
Run Code Online (Sandbox Code Playgroud)
预期产量:
date1|foo1|number1
date2|foo2|number2
...
date1|bar1|number1
date2|bar2|number2
...
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的,似乎需要几个小时才能运行:
fgrep -F -f file1.txt file2.txt > file.matched
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好,更快的方法使用常见的Unix命令或小脚本执行此操作.
我正在研究现有的应用程序.此应用程序从大文件中读取数据,然后在进行一些计算后,将数据存储在另一个表中.
但这样做的循环(见下文)需要很长时间.由于文件有时包含1,000条记录,因此整个过程需要数天.
我可以foreach用其他东西替换这个循环吗?我尝试过使用Parallel.ForEach它确实有所帮助.我是新手,所以非常感谢你的帮助.
foreach (record someredord Somereport.r)
{
try
{
using (var command = new SqlCommand("[procname]", sqlConn))
{
command.CommandTimeout = 0;
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(…);
IAsyncResult result = command.BeginExecuteReader();
while (!result.IsCompleted)
{
System.Threading.Thread.Sleep(10);
}
command.EndExecuteReader(result);
}
}
catch (Exception e)
{
…
}
}
Run Code Online (Sandbox Code Playgroud)
在查看答案后,我删除了Async并使用了编辑后的代码.但这并没有提高性能.
using (command = new SqlCommand("[sp]", sqlConn))
{
command.CommandTimeout = 0;
command.CommandType = CommandType.StoredProcedure;
foreach (record someRecord in someReport.)
{
command.Parameters.Clear();
command.Parameters.Add(....)
command.Prepare();
using (dr = command.ExecuteReader())
{
while (dr.Read())
{
if …Run Code Online (Sandbox Code Playgroud) 在grep从查找文件的长行中的模式文件中找到一个短模式的地方,我需要一个工具来允许我提取可以在更长模式中找到的查找文件的短行.
换句话说,鉴于莎士比亚的作品每行一句并说法语词典,我想找到哪些法语单词在莎士比亚的哪一行中找到,从而可以发现莎士比亚的一行可能包含更多的事实不止一个法语单词,而且法语单词可能出现在莎士比亚的不止一行中.
例如:
pattern_file={
"The sun is shining!"
"It is a beautiful day!"}
lookup_file={
"Rain"
"Sun"
"Cloud"
"Beautiful"
"Shining"}
Run Code Online (Sandbox Code Playgroud)
我想要的是什么
function file pattern
Run Code Online (Sandbox Code Playgroud)
给出在较长模式中找到的行和由昏迷分隔的较长模式本身,同时检测多个匹配.
ideal_result_file={
"Sun","The sun is shining!"
"Beautiful","It is a beautiful day!",
"Shining", "The sun is shining!"}
Run Code Online (Sandbox Code Playgroud)
目前,我使用grep逐行遍历整个查找文件:
while read line
do
grep -is $line pattern_file | sed 's/^/'"$line"'\,/g' >> result_file.csv
done < lookup_file
Run Code Online (Sandbox Code Playgroud)
这非常慢!我的lookup_file包含超过50 000行,而我的pattern_file包含500.使用grep在lookup_file中查找更短的模式需要几秒钟,使用我的循环方法的单次传递需要一天/几周.
任何语言的解决方案将不胜感激.
与
在大型数据集上使用grep或fgrep的非常慢的循环
相比,Perl比bash更快吗?
该解决方案需要与GB大小的循环和模式文件兼容.