首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sed性能优化

Sed性能优化
EN

Stack Overflow用户
提问于 2018-07-21 00:04:39
回答 1查看 547关注 0票数 3

我注意到,当我使用带有-i参数的sed时,它使用的磁盘读/写资源比我将sed的输出重定向到一个全新的文件时要少得多,因此后者的速度要快得多(至少在我的经验中是这样)。为什么会这样呢?

以下是我使用的特定命令-

代码语言:javascript
复制
     sed -i '/\r/ s///g' file.txt <-- Slower one
     sed '/\r/ s///g' file.txt > file2.txt <-- Much faster one

此外,我注意到当我在一个大小约为35MB的文件上使用sed时,它能够在大约0.3秒内处理它(当我重定向而不是使用-i arg时)。但是,当我处理一个大约7倍大的文件时,操作大约需要20秒(同样,使用重定向而不是-i参数)。为什么会这样呢?这是否意味着sed对一堆小文件的处理速度比对一个大文件的处理速度快得多?当我有一个大小约为25 in的文件时,在使用sed处理它之前拆分文件是否最符合我的利益?

EN

回答 1

Stack Overflow用户

发布于 2018-07-21 03:23:26

我在Linux上使用GNU sed 4.4进行了测试,它应该类似于您的Cygwin。strace -o dump sed ...显示了每种情况下发生的情况:

使用重定向时,5MB文件的缓冲输出会导致2498次读取/写入:

代码语言:javascript
复制
openat(AT_FDCWD, "file.txt", O_RDONLY)  = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=5213926, ...}) = 0
read(3, "The Project Gutenberg EBook of T"..., 4096) = 4096
fstat(1, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
read(3, "\nBook 01        Genesis\r\n\r\n01:00"..., 4096) = 4096
write(1, "The Project Gutenberg EBook of T"..., 4096) = 4096
read(3, "wn image, in the image of God\r\n "..., 4096) = 4096
write(1, "002 And the earth was without fo"..., 4096) = 4096
read(3, "cattle, and to the fowl of the a"..., 4096) = 4096
write(1, "replenish the earth, and subdue "..., 4096) = 4096

使用-i时,无缓冲I/O会导致对同一文件执行115,805次读/写操作:

代码语言:javascript
复制
openat(AT_FDCWD, "file.txt", O_RDONLY)  = 3
openat(AT_FDCWD, "./sed6RccPF", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
read(3, "The Project Gutenberg EBook of T"..., 4096) = 4096
write(4, "The Project Gutenberg EBook of T"..., 61) = 61
write(4, "of the King James Bible\n", 24) = 24  
write(4, "\n", 1)                       = 1
write(4, "Copyright laws are changing all "..., 69) = 69
write(4, "copyright laws for your country "..., 69) = 69
write(4, "this or any other Project Gutenb"..., 43) = 43 
write(4, "\n", 1)                       = 1                

最新的git commit也是这样的。

在这个问题得到解决之前,您可能希望使用重定向(或者更好的方式,使用更合适的工具,比如本例中的tr )。

无论文件大小如何,sed进程的速度都是相同的,您看到的任何差异都很可能是由操作系统或驱动器缓存造成的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51446465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档