免费注册 查看新帖 |

Chinaunix

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

Perl 异步 写入行+删除行 到文件 [复制链接]

论坛徽章:
1
白羊座
日期:2013-11-09 20:03:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-13 19:26 |只看该作者 |倒序浏览
最近学习了Perl异步模块Coro和Perl非阻塞的AnyEvent::HTTP模块,为了更深入的学习异步编程思想,准备写个入门程序。

最合适的就是爬虫了,我是用Coro的信号控制HTTP请求数量的,入口是一个网站主页,只准备抓一个站点。

有一个%root的hash变量,用来将站点的所有URL层次化的保存在%root里面,并保存抓取状态(是否已抓取)。

sub URL_add
{
    # $p用于指向%root各个层次的指针
    my $p      = shift;
    my $url    = shift;

    my $is_new = 0;
    my @depths = split '/', $url;
    foreach (@depths){
        # 判断是否存在相同路径
        if ( ! $p->{$_} ){
            # 下级永远保存一个引用
            $p->{$_} = {};
            $is_new  = 1;
        }
        # 指向下一级的引用
        $p = $p->{$_};
    }
    # 标记新路径或则未标记路径,'//'代表标记结尾,值1代表未查询
    $p->{'//'} = 1 if $is_new || ! $p->{'//'};
}


抓取的URL与该%root匹配,如果已存在就丢弃。

论坛徽章:
1
白羊座
日期:2013-11-09 20:03:00
2 [报告]
发表于 2013-12-13 19:30 |只看该作者
这里有个问题,如果每次要生成一个新的请求都要重%root里面遍历一下未请求的网址,然后生成url提交请求。
这样就产生了一个效率问题,毕竟hash用来判断URL的请求状态是很快的,但是遍历就没有优势了。

所以我就想把未请求的网址写入一个@url里面,不过随着请求页面越来越多,@url会达到一个很高的内存占用。

终于可以带出本帖的主题了,将该@url以文件的形式存在硬盘里。

论坛徽章:
1
白羊座
日期:2013-11-09 20:03:00
3 [报告]
发表于 2013-12-13 19:33 |只看该作者
但是对Perl的文件读写机制了解不透。
知道是有读写缓存的,这个是我需要的,要不然频繁的IO会影响效率,读写的锁准备用Coro的信号量简单判断一下。

现在我测试下来,是写入有缓存,读文件是不会读到该缓存里面的,问题就在这里了,请问下如何解决这问题呢

论坛徽章:
1
白羊座
日期:2013-11-09 20:03:00
4 [报告]
发表于 2013-12-13 20:25 |只看该作者
$p->{'//'} = 1 if $is_new || ! $p->{'//'}; 这句错了应该是
$p->{'//'} = 1 if $is_new || ! exists $p->{'//'};

论坛徽章:
1
白羊座
日期:2013-11-09 20:03:00
5 [报告]
发表于 2013-12-13 21:42 |只看该作者
准备用Coro::Channel模仿缓存,生成两个列队一个读一个写。

论坛徽章:
0
6 [报告]
发表于 2014-02-19 19:08 |只看该作者
use Tie::File;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP