添加以下代码到你的博客中: (呵呵,抄袭至lulu Studio  http://s8.hk/0itw)


<script type="text/javascript">
    $(function(){
        c_url = 'http://s8.hk:8088/s8/s?format=text&longUrl=';
        c_url += document.location.href;
        c_url += '&jsonp=?'
        $.getJSON(c_url, function(data){
            $("<div>本文短址:</div>").css("font-weight", "normal")
                .css("font-size", "12px")
                .append($("<a>"+data+"</a>").attr("href", data))
                .appendTo(".post .postTitle"); # 此行需要特殊处理,不过在博客园一般情况下是不用修改的。
        });
    });
</script> 

 

have fun.
 ^_^

 

P.S: #GoogleCN,你走了,我们怎么办?

posted @ 2010-01-15 15:51 MK2 阅读(56) | 评论 (0)编辑

测试用例修改自:myconnpy appears to be roughly an order of magnitude slower than MySQLdb ,在它的基础上,还加入psyco优化后的性能对比

测试代码:

#!/usr/bin/env python
#
 -*- coding: utf-8 -*-
"""benchmark
"""
from mysql import connector
import MySQLdb
import time
baseq 
= "SELECT * FROM url limit 10"

def measure(func, *args, **kw):
    start 
= time.time()
    result 
= func(*args, **kw)
    end 
= time.time()
    
return end - start, result

def scansequential(iters, connect):
    
for i in xrange(iters):
        
if MySQLdb.connect == connect:
            conn 
= connect(host='localhost', port=3306, user='aaa', passwd='123', db='test')
        
else:
            conn 
= connect(host='localhost', port=3306, user='aaa', password='123', db='test')
        
for i in xrange(5):
            curs 
= conn.cursor()
            retval 
= curs.execute(baseq)
            orig_rowcount 
= curs.rowcount
            rows 
= curs.fetchall()
            curs.close()
        conn.close()

iters 
= 100
t, _ 
= measure(scansequential, iters, connector.Connect)
print "myconnpy", t
t, _ 
= measure(scansequential, iters, MySQLdb.connect)
print "MySQLdb", t
import psyco
psyco.full()
t, _ 
= measure(scansequential, iters, connector.Connect)
print "myconnpy with psyco", t

获取10行数据:

myconnpy 2.53226113319
MySQLdb 0.572678804398
myconnpy with psyco 1.79596400261

获取50行数据:

myconnpy 6.3902618885
MySQLdb 1.56350803375
myconnpy with psyco 4.51574015617

获取100行数据:

myconnpy 11.1748549938
MySQLdb 2.54134678841
myconnpy with psyco 7.9241900444

 

明显myconnpyMySQLdb慢了5倍之多,获取这是纯python实现的通病吧(弱势),加入psyco后,性能有了提高,但是和MySQLdb还是有3x的差距。

不过有了这个纯python的实现,结合异步IO(非阻塞IO),完全可以将数据访问非阻塞的,让它满足stackless, eventlet, coroutine, diesel, tornado等协程开发。

^_^.

posted @ 2009-11-20 09:22 MK2 阅读(197) | 评论 (0)编辑

使用完善的myconnpy吧!

 

以下可以忽略!

 

pymysql是个不错的纯python实现的mysql api,获取源代码执行一些测试发现有一些bug,目前发现的是无法处理日期和NULL,调试了一些,对connections.py进行了3处修改,测试代码就运行起来了,还有converters.py也有bug,下载 " Issue 3:       undefined methods datetime_or_None, date_or_None" 这里面的附件converters.py,替换converters.py就可以了。

这里下载 connections.py 吧,运行吧。。。难得一见的pure python mysql api.

既然有了pure python实现,让它变成非阻塞的,就指日可待了。

 

希望本文对你有用 ^_^

posted @ 2009-11-19 19:38 MK2 阅读(147) | 评论 (0)编辑

即使使用了类似tornado这样的非阻塞io web服务器,能让我们的web性能提供很多,但是在实际应用中与测试的效果相差很远,应该是说我们的测试考虑非常不全面。

现在的web应用几乎不可能少了数据库访问操作,而数据库访问操作却是阻塞的, 如MySQLdb,显然,类似tornado,stackless这些协程方式编写的web,性能会受到大大的制约。

解决方案:让数据库操作变成非阻塞的

eventlet中的db_pool实现是一个很好的开始。

它又是如何实现的呢?即使eventlet实现了非阻塞的socket(因为MySQLdb没有使用到),显然MySQLdb的C代码实现肯定是阻塞的。客观条件下无法变成非阻塞的,只有改变一下思路,使用线程来达到非阻塞不就可以了?eventlet不仅有线程实现版本,还有一个进程的实现版本(SaranwrappedConnectionPool),有兴趣的pythonic可以看看db_pool源代码 (http://bitbucket.org/which_linden/eventlet/src/tip/eventlet/db_pool.py),YD一番吧。

 

^_^.

 

posted @ 2009-11-18 14:56 MK2 阅读(210) | 评论 (0)编辑

操作系统:Ubuntu 9.10

下载hadoop: hadoop-0.20.1.tar.gz

安装依赖软件:

Java 1.6x 或以上

$ sudo apt-get install sun-java6-bin

在conf/hadoo-env.sh设在JAVA_HOME变量:

JAVA_HOME=/usr/lib/jvm/java-6-sun

ssh及sshd

$ sudo apt-get install openssh-server

hadoop测试环境配置(单机, 模拟分布式环境)

namenode节点配置

conf/core-site.xml:

<configuration>
  
<property>
    
<name>fs.default.name</name>
    
<value>hdfs://localhost:9000</value>
  
</property>
</configuration>

hdfs测试环境配置

conf/hdfs-site.xml: 数据块不需要冗余

<configuration>
  
<property>
    
<name>dfs.replication</name>
    
<value>1</value>
  
</property>
</configuration>

job-tracker配置

conf/mapred-site.xml:

<configuration>
  
<property>
    
<name>mapred.job.tracker</name>
    
<value>localhost:9001</value>
  
</property>
</configuration>

免密码ssh登录配置

 

$ ssh localhost
# 若不行, 则进行以下配置
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

 

初始化HDFS, 启动hadoop

 

$ bin/hadoop namenode -format
$ bin/start-all.sh
# 所有运行日志都在 ${HADOOP_LOG_DIR} 目录,  (默认是 ${HADOOP_HOME}/logs).

马上查看NameNode和 JobTracker吧:

NameNode - http://localhost:50070/

JobTracker - http://localhost:50030/

官方文档: Hadoop Quick Start

posted @ 2009-11-16 10:43 MK2 阅读(191) | 评论 (0)编辑
     摘要: Tokyo Cabinet: 下载 http://1978th.net/tokyocabinet/tokyocabinet-1.4.36.tar.gz依赖包:zlib: sudo apt-get install zlib1g-devbzip2: sudo apt-get install libbz2-dev安装:tar zxvf tokyocabinet-1.4.36.tar.gzcd tokyo...  阅读全文
posted @ 2009-11-05 11:57 MK2 阅读(267) | 评论 (0)编辑
     摘要: 由于JSONP强大的跨域访问功能,发现tornado没有对jsonp的默认支持,还好tornado是开源的,就简单实现了一个JSONPHandler,对一切JSONP请求进行封装。JSONPHandler实现代码如下:只需要对finish方法进行简单封装,即可[代码]测试代码:main.py[代码]index.html[代码]测试结果:浏览器访问: http://www.client.com:80...  阅读全文
posted @ 2009-11-05 08:51 MK2 阅读(208) | 评论 (0)编辑
     摘要: 测试环境:服务器配置: 4 x Intel(R) Xeon(R) CPU E5405 @ 2.00GHz, 4G内存, 操作系统: CentOS 5.3 x86_64nginx前端 + 4 tornado(0.2) web processtornado: http://www.tornadoweb.org (已被墙)测试场景: http get请求,服务器端直接返回"hello world"代码及...  阅读全文
posted @ 2009-10-28 16:49 MK2 阅读(442) | 评论 (0)编辑
     摘要: Tokyo Dystopia是一个全文搜索引擎,究竟它的性能如何呢?能否用于海量数据搜索呢?我使用了1000w(实际10170524条记录)网站标题来分词,并用于Tokyo Dystopia做本文相关的测试数据。 本文所有的测试都直接使用Tokyo Dystopia的dystmgr命令行工具完成。 导入1000w数据测试 $time dystmgr importtsv urls1000w u...  阅读全文
posted @ 2009-10-22 15:33 MK2 阅读(121) | 评论 (0)编辑
     摘要: 最近拿到一大堆数据,在对其做完MapReduce统计后,需要提炼一些有价值的数据出来使用。1. 同一数据重复出现,是否大堆一定概率或者重现数量达到某个范围,就能确定该数据是有效的呢?2. 数据的时间有效性。若这组数据是跟时间相关的,时间这个参数是否需要考虑进去,具体的时间参考值又需要如何定义呢?3. 随机出现的干扰数据,是否也有一些规律性呢?一旦这些干扰数据消失,是好事还是坏事呢?4. 海量数据统...  阅读全文
posted @ 2009-08-20 00:20 MK2 阅读(125) | 评论 (0)编辑
     摘要: 周末闲着无聊,想学学firefox插件开发,模仿金山网盾的搜索结果ie插件,做了一个firefox版的。其实代码逻辑很简单,就是使用XMLHttpRequest异步请求,然后组装返回结果,输出到页面上;由于对XUL不熟悉,就直接使用html完成了。效果截图如下:搜索关键词: 非主流还能右键验证选中url:呵呵,just fun.下载地址: urlsafefox.xpi 2009.8.25 更新: ...  阅读全文
posted @ 2009-08-15 21:42 MK2 阅读(173) | 评论 (0)编辑
     摘要: 到底web服务器的极限是多少呢?100 r/s? 500 r/s?还是1000 r/s?在StaticGenerator上看到,原来1000 r/s都不算什么.真的是这样吗?如果是真的那就太恐怖了。目前的web基本上都是动态的,为了提高性能,我们常常会使用各种各样的手段优化,例如减少IO,合理的字符串使用和操作,memcached等等。但是尽管全部优化都做足了,全动态的web点击率以是在1000 ...  阅读全文
posted @ 2009-04-25 16:48 MK2 阅读(523) | 评论 (3)编辑
     摘要: 假如你的服务器很慢,而且经常无法连接,很可能你遇上了我最近的烦恼.试着执行:$ netstat -nta|awk '/^tcp/{++S[$NF]} END {for(a in S) print a,S[a]}'如果结果类似:LAST_ACK 14SYN_RECV 348ESTABLISHED 70FIN_WAIT1 229FIN_WAIT2 30CLOSING 33TIME_WAIT 18122...  阅读全文
posted @ 2009-03-26 15:14 MK2 阅读(366) | 评论 (0)编辑
     摘要: Tenjin, "Tenjin is a very fast and full-featured template engine available in several script languages."官方的测试结果: 也快得太夸张了MacOS X 10.4 Tiger, Intel CoreDuo 1.83GHz, Memory 2GB Language Template Engine...  阅读全文
posted @ 2009-03-22 12:52 MK2 阅读(465) | 评论 (1)编辑
     摘要: 在看PEP-0138时无意发现,就萌生起自己实现一个类似的装饰器的念头,毕竟这个装饰器确实很好用。其中accepts和returns是在原有的基础上进行改造的,详细可以查看代码[代码]使用举例:若accepts与其他任何装饰器同时使用的话,必须将accepts放到最内层,要不然,会导致参数校验异常.[代码]PS: synchronized 装饰方法在python2.5 + 可以使用with语法来代...  阅读全文
posted @ 2009-02-08 12:27 MK2 阅读(265) | 评论 (0)编辑