为sys.stdin设置较小的缓冲区大小?

为sys.stdin设置较小的缓冲区大小?

我正在使用以下bash命令模式运行memcached:

memcached -vv 2>&1 | tee memkeywatch2010098.log 2>&1 | ~/bin/memtracer.py | tee memkeywatchCounts20100908.log

尝试跟踪无与伦比的获取到平台键的集合。

memtracer脚本位于下方并按预期工作,只有一个小问题。看到中间日志文件大小,memtracer.py在memkeywatchYMD.log大小约为15-18K之前不会开始输入。有没有更好的方法来读取stdin或者可能是将缓冲区大小降低到1k以下以获得更快的响应时间?

#!/usr/bin/pythonimport sysfrom collections import defaultdictif __name__ == "__main__":


    keys = defaultdict(int)
    GET = 1
    SET = 2
    CLIENT = 1
    SERVER = 2

    #if <
    for line in sys.stdin:
        key = None
        components = line.strip().split(" ")
        #newConn = components[0][1:3]
        direction = CLIENT if components[0].startswith("<") else SERVER        #if lastConn != newConn:        
        #    lastConn = newConn

        if direction == CLIENT:            
            command = SET if components[1] == "set" else GET
            key = components[2]
            if command == SET:                
                keys[key] -= 1                                                                                    
        elif direction == SERVER:
            command = components[1]
            if command == "sending":
                key = components[3] 
                keys[key] += 1

        if key != None:
            print "%s:%s" % ( key, keys[key], )


隔江千里
浏览 726回答 3
3回答

烙印99

您可以使用python的-u标志从stdin / stdout中完全删除缓冲:-u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;unbuffered&nbsp;binary&nbsp;stdout&nbsp;and&nbsp;stderr&nbsp;(also&nbsp;PYTHONUNBUFFERED=x) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;see&nbsp;man&nbsp;page&nbsp;for&nbsp;details&nbsp;on&nbsp;internal&nbsp;buffering&nbsp;relating&nbsp;to&nbsp;'-u'并且手册页澄清了:&nbsp;&nbsp;&nbsp;-u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Force&nbsp;stdin,&nbsp;stdout&nbsp;and&nbsp;stderr&nbsp;to&nbsp;&nbsp;be&nbsp;&nbsp;totally&nbsp;&nbsp;unbuffered.&nbsp;&nbsp;&nbsp;On &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;systems&nbsp;&nbsp;where&nbsp;&nbsp;it&nbsp;matters,&nbsp;also&nbsp;put&nbsp;stdin,&nbsp;stdout&nbsp;and&nbsp;stderr&nbsp;in &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binary&nbsp;mode.&nbsp;&nbsp;Note&nbsp;that&nbsp;there&nbsp;is&nbsp;internal&nbsp;&nbsp;buffering&nbsp;&nbsp;in&nbsp;&nbsp;xread- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines(),&nbsp;&nbsp;readlines()&nbsp;&nbsp;and&nbsp;&nbsp;file-object&nbsp;&nbsp;iterators&nbsp;("for&nbsp;line&nbsp;in &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys.stdin")&nbsp;which&nbsp;is&nbsp;not&nbsp;influenced&nbsp;by&nbsp;&nbsp;this&nbsp;&nbsp;option.&nbsp;&nbsp;&nbsp;To&nbsp;&nbsp;work &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;around&nbsp;&nbsp;this,&nbsp;you&nbsp;will&nbsp;want&nbsp;to&nbsp;use&nbsp;"sys.stdin.readline()"&nbsp;inside &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;"while&nbsp;1:"&nbsp;loop.除此之外,不支持更改现有文件的缓冲,但是您可以使用os.fdopen创建具有与现有文件相同的基础文件描述符的新文件对象,并可能使用不同的缓冲。也就是说,import&nbsp;osimport&nbsp;sys newin&nbsp;=&nbsp;os.fdopen(sys.stdin.fileno(),&nbsp;'r',&nbsp;100)应该绑定newin到一个文件对象的名称,该文件对象读取与标准输入相同的FD,但一次只缓冲大约100个字节(并且您可以继续sys.stdin = newin使用新文件对象作为此处的标准输入)。我说“应该”,因为这个区域过去常常在某些平台上出现一些错误和问题(提供完全通用的跨平台功能非常困难) - 我不确定它现在的状态是什么,但是我d绝对建议在所有感兴趣的平台上进行全面测试,以确保一切顺利。(-u,完全删除缓冲,如果可能满足您的要求,应该在所有平台上使用更少的问题)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python