免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3341 | 回复: 8
打印 上一主题 下一主题

求证 sed 的内存使用(以文件倒序排放为例)  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-17 09:35 |只看该作者 |倒序浏览
记得以前看到过将文件内容倒序的经典例子,但有一天晚上突然想不起来了,只记得思路是将pattern space中的内容放入hold space中,再取出来。照着这个思路我想啊想,终于想出了如下代码:
  1. sed '1!G;$!h;$!d' filename
复制代码

第二天早上急忙来本版看到底是如何写的,发现是如下写法:
  1. sed '1!G;h;$!d' filename
复制代码

差别在于我写的在h前多加了一个$!
      我就想了,照我们写程序的人的习惯思维,将判断写入循环内将降低程序的性能,也就是我的写法中多加的判断降低程序的性能。另外,因为pattern space和 hold space中均会存放大量的文本,这个脚本会很占内存。照逻辑来说,最后一次的h是没有必要的,他无端占用了更多的内存。
    于是我就想测试一下,比较一下这两种写法的性能如何。不料却发现了另外一个事实。也就是说,当我测试的这个文件的大小超过4097时,无论哪一种写法都会core掉,所以性能是测不出来了。但我就疑惑了:

   sed到底是如何使用内存的呢?

论坛徽章:
0
2 [报告]
发表于 2004-03-17 10:10 |只看该作者

求证 sed 的内存使用(以文件倒序排放为例)

太高深了,不大懂,顶一下。

论坛徽章:
0
3 [报告]
发表于 2004-03-17 12:52 |只看该作者

求证 sed 的内存使用(以文件倒序排放为例)

[quote]原帖由 "skydog2002"]当我测试的这个文件的大小超过4097时,无论哪一种写法都会core掉[/quote 发表:

没这么脆弱吧?我测试一个你的20倍的都没有问题呀。答案为 sed '1!G;h;$!d' 用时更少。

论坛徽章:
0
4 [报告]
发表于 2004-03-17 15:44 |只看该作者

求证 sed 的内存使用(以文件倒序排放为例)

我用hp unix 11.0时是4098个字节就会 Memory fault(coredump),
用sco unix时是8210个字节就会 Memory fault(coredump)

所以我的疑惑已经不在于哪种用时更少,而是在于:

我加了“$!”在h之前,对于内存的使用看不到任何差别,
两种方法的 core 掉的文件尺寸的上界是一样的。
而我的想法是在加了“$!”在h之前的时候,core 掉的文件尺寸的上界应该大一些。


为什么呢?

所以我希望对这方面有研究的先行者在这里稍作解释。谢了!

论坛徽章:
0
5 [报告]
发表于 2004-03-17 19:05 |只看该作者

求证 sed 的内存使用(以文件倒序排放为例)

这个问题有意思,值得关注。

论坛徽章:
0
6 [报告]
发表于 2004-03-18 09:35 |只看该作者

求证 sed 的内存使用(以文件倒序排放为例)

终于稍有了一些认识。在说明之前,首写纠正我先前的一个说法。
原帖由 "skydog2002" 发表:
照逻辑来说,最后一次的h是没有必要的,他无端占用了更多的内存。

这个说法欠妥,其实没有占用了更多的内存,只是占用了文件的最后一行大小的内存。让我们分析一下这个脚本:
  1. 1!G;h;$!d
复制代码

我们假定要处理的文件有n行,当前行为m行。
当m=1时,这三个命令执行完毕后,
pattern space内容:第二行的内容
hold space内容:第一行的内容
......
依次执行到第m行后
pattern space内容:第m+1行的内容
hold space内容:前m行的内容的倒序排放
......
当m=n时,也就是说执行到第n-1行之后,
pattern space内容:第n行的内容
hold space内容:前n-1行的内容的倒序排放
此时在执行这三个命令:
1!G -- 将hold space的内容附加于pattern space中的第n行之后
       pattern space内容变为前n行的内容的倒序排放
h    -- 将pattern space内容覆盖 hold space的内容
       hold space内容变为前n行的内容的倒序排放(较先前多了文件最后一行的内容)
$!d  -- 不执行
此时没有下一行了,将pattern space中的内容输出。

大体就是这样子了。所以说,我先前的说法欠妥。

论坛徽章:
0
7 [报告]
发表于 2004-03-18 09:43 |只看该作者

求证 sed 的内存使用(以文件倒序排放为例)

我发现我测试的文件有一些问题,问题在于我测试的文件的最后一行内容多了些。所以我得出的结论,两次测试的core掉的文件尺寸上限一样,就是不对的了。

我将测试文件改为,最后几行均为一个字符,终于测出在文件大小在4098时,
  1. sed '1!G;$!h;$!d' filename
复制代码

没有core掉;
  1. sed '1!G;h;$!d' filename
复制代码

core掉。

我测试的环境是hpunix

不过可惜的是,我的写法虽然没有core掉,但是也没有输出。

至于为什么会core掉,我只能猜想sed中预先为两个空间分配了内存,不同的系统,分配的大小不一样,超过了这个尺寸就会core

至于为什么没有输出,原因找不出来。

有些遗憾,但苦于找不到资料,只好以后有机会再说了。

谢谢朽木可雕 、labrun两位的关注。

论坛徽章:
0
8 [报告]
发表于 2004-03-18 12:32 |只看该作者

求证 sed 的内存使用(以文件倒序排放为例)

[quote]原帖由 "朽木可雕"]太高深了,不大懂,顶一下。[/quote 发表:

同感 @_@

论坛徽章:
0
9 [报告]
发表于 2004-03-18 17:21 |只看该作者

求证 sed 的内存使用(以文件倒序排放为例)

我在本版看到过两篇帖子,其中一篇就是版主看到的,另外一篇专门讨论模式空间与保持空间,那几天研究里面的例子真是几乎想破了头,但是还是很迷惑,很多不懂,感觉就像用汇编,只有几个寄存器让你用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP