blog mail me! feed

Stage2 开发笔记

Sept 9
完成了基于栈的深度优先目录爬虫原型, 不过在实验爬的过程中, 各种古怪的Exception无数次打断爬虫工作,
这就是错误处理做得烂的恶果啊…

工作最后被打断在对含空格, 尤其是连续空格的文件名处理上, 苦想了半个小时, 也没想好怎么更快的通过split函数处理.

Sept 10
基于正则重写了字符串处理, 结果性能还比该死的split+filter高.
第一次看着爬虫模拟爬行, 处理完了清水河畔的202.115.22.16:21的FTP的所有目录, 接下来开始处理文件.

昨天大概想了下, 对于目录内只有文件而没有子目录的情况, 可以做一个FLAG, 这类的目录可以只判断最后修改时间即可, 没有发生修改则无需再进目录爬内容, 其他的情况都需要执行CWD再爬行.

太阳落山, 实验了下爬出的所有目录的写入数据库, 习惯了数据入库前的数据转义, 找了半天Python里转义与反转义的函数, 后来恍然大悟, 文件名是不可以有这些需要被转义的字符的. XD
想了很久的文件比对列表重建, 后来还是选择了相对容易实现, 和容易比对的平面dict重建.

将所有的目录都放在一个平面的dict中, key是文件夹的path(要不要用path的hash呢?), value是另一个dict, 定义了数据库中对应的唯一ID, 以及一个目录下文件的”files”的dict入口.

Sept 11
完成了对爬虫算法的所有优化, 即本地缓存的构造与文件/文件夹是否更新的检查.
在爬虫完成了首次对FTP仓库的探索后, 之后的每次爬行会进行可能的, 不含推测的最大优化,
这样, 每次的爬行可以避免重复的抓取长时间不会更新的文件.

对于如何在Python和PHP中构建相同的分词体系, 还在考虑中,
原来考虑过在Python里使用pymmseg-cpp, 但是后来担心词库和分词算法的不同, 使PHP和Python下的key不匹配, 结果就是, 搜索失败.

自己现在的想法是做一个scwsd, 即基于scws的守护程序, 监听某个端口完成分词API的执行,
即可做到分词的一致性.
*EDIT* 觉得似乎就在php里完成分词和Xapian Index最简单, 数据库里只需要做一个默认的字段, php每次检查尚未分词的条目进行分词即可 :)

当前还没有考虑好, 对于已删除的文件或文件夹的处理方法,
是建立一张回收表, 还是建立一个”已删除”的字段呢?

Sept 16
添加了对于部分无效目录的判断, 防止在爬行时出现的无效目录导致的无数bug的问题.
另外在些错误自陷时, 将当前的目录移除出缓存, 保证了最后处理”已删除目录和文件”时出现的冲突.

莫非树状结构回复只能通过递归实现?

很早前的众多论坛都是树状的, 比如古老的DS, 老旧的新浪论坛,
到现在树状结构更多的被用于评论的再评论/回复中, 比如slashdot, digg.

以前一直没想明白树状到底是怎么展开的,
我的脑子里大概就两种方法:

  1. 每个reply都赋予同样的root_id, 但可能有不同的father_id. 读取所有特定root_id的reply, 再依照father_id来建立树状结构. 好处是可以一次性的从数据库中取出结果, 坏处是树状结构复杂时, 对树状结构的重建需要消耗不少时间. 当然, 一个好的缓存结构可以避免对已经重建的结构多次重建.
  2. 仅保留father_id, father_id=0的可以认为是主贴, 压入栈中, 然后再根据reply_id递归逐级展开帖子. 好处是逻辑和实现非常简单, 坏处是数次的数据库查询, 有连接池时固然可以减少一定的数据库负担, 但大量频繁的数据对数据库还是考验.

无论哪种看来, 树状结构和平板结构比起来, 为了更多的逻辑归属和指向性, 要付出更多的资源消耗.
除非, 还有更好的算法?