我想有效地做到这一点:
my $buf;
my $len = read(STDIN,$buf,1);
if($len) {
# Not empty
open(OUT,"|-", "wc") || die;
print OUT $buf;
# This is the line I want to do faster
print OUT <STDIN>;
exit;
}
Run Code Online (Sandbox Code Playgroud)
任务是wc仅在有任何输入时启动.如果没有输入,程序应该退出.
wc这只是一个例子.它将被一个更复杂的命令所取代.
输入可能是几TB的数据,所以我真的不想触摸那些数据(甚至没有a sysread).我试过做:
pipe(STDIN,OUT);
Run Code Online (Sandbox Code Playgroud)
但这不起作用.有没有其他方法可以告诉OUT,在获得第一个字节后,它应该只读取STDIN?也许一些开放式("> =&2")体操结合exec?
我有一个运行速度很慢的功能.我需要在程序的主要部分输入该函数.所以我想做一些类似于UNIX命令的东西yes,它产生尽可能多的输入,但只需要多一点.不像yes我不想要STDIN的值,但我想要Perl队列中的值.
换句话说:这个问题不是关于文件句柄的选择,而是关于线程维护的队列.
我想,元代码看起来与此类似:
my $DataQueue = Thread::Queue->new();
my @producers;
my $no_of_threads = 10;
for (1..$no_of_threads) {
push @producers, threads->create(\&producer);
}
for(<>) {
# This should block until there is a value to dequeue
# Maybe dequeue blocks by default - then this part is not a problem
my $val = $DataQueue->dequeue();
do_something($_,$val);
}
# We are done: The producers are no longer needed
kill @producers;
sub producer {
while(1) {
# How do I wait until …Run Code Online (Sandbox Code Playgroud) 这:
while($read=sysread(STDIN,$buf,32760)) {
$buf=~s/\r/posttag\rpretag\t/go;
$buf=~s/\n/posttag\npretag\t/go;
syswrite(STDOUT,$buf);
}
Run Code Online (Sandbox Code Playgroud)
在我的系统上传输约 200 MB/s。
这:
my $pretag = "pretag";
my $posttag = "posttag";
while($read=sysread(STDIN,$buf,32760)) {
$buf=~s/\r/$posttag\r$pretag\t/go;
$buf=~s/\n/$posttag\n$pretag\t/go;
syswrite(STDOUT,$buf);
}
Run Code Online (Sandbox Code Playgroud)
在我的系统上传输约 100 MB/s。
为什么?
我认为当我使用时,/o内容是变量还是固定字符串应该没有关系。有没有一种简单的方法可以达到第一个的速度?
我从STDIN读了几行.如何将剩余的STDIN传递给从标准输入读取的命令(例如md5sum或wc)?
我可以做一个:
read_a_few_lines_from_diamond_operator();
open (C, "|cmd");
while(<>) { print C }
close C;
cleanup_after_C();
Run Code Online (Sandbox Code Playgroud)
但出于效率原因,我不想触摸输入,而是传递STDIN的文件句柄.有点像:
seq 10 | (read A; wc)
Run Code Online (Sandbox Code Playgroud)
在read将其余部分传递给之前,尽可能多地读取wc.我不能使用这个解决方案,因为我需要从我的perl程序中启动命令,我需要在cmd完成后完成工作.
我从'foo'文件中读了几行.如何将剩余部分传递给从标准输入读取的命令(例如md5sum或wc)?
我可以做一个:
open (F, "<foo");
read_a_few_lines_from_F();
open (C, "|cmd");
while(<F>) { print C }
close C;
cleanup_after_C();
Run Code Online (Sandbox Code Playgroud)
但出于效率原因,我不想触摸输入,而是传递文件'foo'的其余部分.
我有一种感觉,它可以使用欺骗等做select,open(FOO,">&STDOUT),exec 6<&0,fork,pipe.
我正在使用此命令成功搜索:从ips.txt日志目录(压缩文件)中的 txt 文件中搜索可疑 IP 列表。
root@yop# find /mylogs/ -exec zgrep -i -f ips.txt {} \; > ips.result.txt
Run Code Online (Sandbox Code Playgroud)
我现在想使用并行与它使用..以加快搜索速度。我目前无法找到正确的参数。我的意思是使用模式文件(每行一个)并将其导出到结果文件中。
请问有没有类似的大师?
我发现的更接近的命令是: grep-or-anything-else-many-files-with-multiprocessor-power
但是无法将它与模式文件列表一起使用并将结果导出到文件中......
请帮忙,谢谢大家。
我有程序(gawk)将数据流输出到其STDOUT.处理的数据实际上是10英镑.我不想将它保存在单个文件中,而是将其拆分为块,并可能在保存之前对每个文件应用一些额外的处理(如压缩).
我的数据是一系列记录,我不想拆分将记录减半.每条记录都匹配以下正则表达式:
^\{index.+?\}\}\n\{.+?\}$
或者为了简单起见,可以假设两行(首先是不均匀的,甚至在从流的开始编号时)始终记录.
我可以吗:
我已经意识到像GNU并行的命令,csplit但不知道如何把它放在一起.如果上面解释的功能可以在不编写自定义perl脚本的情况下实现,那将是很好的.然而,这可能是另一个,最后的解决方案,但再次,不知道如何最好地实现它.
除了第一个,Bash有一个简洁的方法来给出数组中的所有元素:
"${a[@]:1}"
Run Code Online (Sandbox Code Playgroud)
为了得到除了最后一个我发现的所有:
"${a[@]:0:$((${#a[@]}-1))}"
Run Code Online (Sandbox Code Playgroud)
但是,伙计,这是丑陋的.
有优雅的选择吗?
我有一个简单的 bash 脚本可以运行:
cat full_path.csv | parallel --progress -j +0 'echo -n {},; pdfgrep -c [^_] {};' > path_count.csv
Run Code Online (Sandbox Code Playgroud)
Parallel 的进度指示器"--progress",写入文件path_count.csv。我只想echo {}和pdfgrep {}写入文件,同时显示--progress到屏幕输出。
如果我做 :
cat full_path.csv | parallel --progress -j +0 'echo -n {},>>path_count.csv; pdfgrep -c [^_] {}>>path_count.csv;'
Run Code Online (Sandbox Code Playgroud)
文件 path_count 仍然是乱码。
任何帮助表示赞赏。谢谢阿尔文
我想返回一个 matrix/data.frame 每行包含参数和文件的内容。
但是,可能有很多文件,所以我更愿意延迟加载文件,因此只有在请求实际内容时才会读取文件。下面的函数主动加载文件,如果as.func=F.
如果它可以延迟加载它们将是完美的,但如果不是内容而是返回一个可以读取内容的函数,这也是可以接受的。
我可以制作读取内容的函数(见下文as.func=T),但由于某种原因,我无法将其放入 data.frame 中以返回。
load_parallel_results <- function(resdir,as.func=F) {
## Find files called .../stdout
stdoutnames <- list.files(path=resdir, pattern="stdout", recursive=T);
## Find files called .../stderr
stderrnames <- list.files(path=resdir, pattern="stderr", recursive=T);
if(as.func) {
## Create functions to read them
stdoutcontents <-
lapply(stdoutnames, function(x) { force(x); return(function() { return(paste(readLines(paste(resdir,x,sep="/")),collapse="\n")) } ) } );
stderrcontents <-
lapply(stderrnames, function(x) { force(x); return(function() { return(paste(readLines(paste(resdir,x,sep="/")),collapse="\n")) } ) } );
} else {
## Read them
stdoutcontents <-
lapply(stdoutnames, function(x) …Run Code Online (Sandbox Code Playgroud) 如果您有方形空间,QR码非常适合打印机器可读的URL.但如果放在文本中它们看起来很可怕,因为它们比文本行高得多.
有没有办法我可以使用与QR码相同功能的1d条形码(URL是最重要的功能)所以它可以作为正常段落中的文本放置而无需特殊格式化?
如果是:我如何生成这些条形码?