当前位置: 首页 > 面试题库 >

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

施振海
2023-03-14
问题内容

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

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

尝试跟踪整个平台上关键的无与伦比的装备。

memtracer脚本在下面,并且可以按预期运行,但有一个小问题。注意中间日志文件的大小,直到memkeywatchYMD.log的大小约为15-18K时,memtracer.py才开始获取输入。有没有更好的方法可以读入stdin或将缓冲区大小减小到1k以下以获得更快的响应时间?

#!/usr/bin/python

import sys
from collections import defaultdict

if __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:

问题答案:

你可以使用python的-u标志从stdin / stdout完全删除缓冲:

-u     : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)
         see man page for details on internal buffering relating to '-u'

手册页阐明了:

   -u     Force stdin, stdout and stderr to  be  totally  unbuffered.   On
          systems  where  it matters, also put stdin, stdout and stderr in
          binary mode.  Note that there is internal  buffering  in  xread-
          lines(),  readlines()  and  file-object  iterators ("for line in
          sys.stdin") which is not influenced by  this  option.   To  work
          around  this, you will want to use "sys.stdin.readline()" inside
          a "while 1:" loop.

除此之外,不支持更改现有文件的缓冲,但是可以使用os.fdopen来创建一个新文件对象,该文件对象具有与现有文件相同的基础文件描述符,并且可能使用不同的缓冲。即

import os
import sys
newin = os.fdopen(sys.stdin.fileno(), 'r', 100)

应该绑定newin到读取与标准输入相同的FD的文件对象的名称,但是一次只能缓冲大约100个字节(并且你可以继续sys.stdin = newin从此开始使用新的文件对象作为标准输入)。我说“应该”,因为这方面的使用有一些平台上的一些错误和问题的(这是相当困难的功能,提供跨平台的全通用) -我不知道它的状态是什么了,但我” d绝对建议在所有感兴趣的平台上进行全面测试,以确保一切顺利。(-u,如果可能会满足你的要求,则完全删除缓冲在所有平台上应减少出现问题)。



 类似资料:
  • 问题内容: 我正在使用以下bash命令模式运行memcached: 尝试跟踪整个平台上无与伦比的按键设置。 memtracer脚本在下面,并且可以按预期运行,但有一个小问题。观察中间日志文件的大小,直到memkeywatchYMD.log的大小约为15-18K时,memtracer.py才开始获取输入。有没有更好的方法可以读入stdin或将缓冲区大小减小到1k以下以获得更快的响应时间? 问题答案:

  • 我尝试调试Tyrus项目,看到变量实际上保持默认值。 有没有人知道我该怎么解决这个问题?

  • 我想在我的小libgdx游戏中使用框架缓冲区。 游戏使用了,我修改了s摄像头,使其使用50宽31高的视口。然后我将的投影矩阵设置为。这样做,我有一个分辨率独立的游戏,我可以使用我自己的“世界单位”,而不是使用像素。 但是现在,如果我创建一个,我必须给它一个大小。我必须给它摄像机视口的大小还是屏幕的大小(以像素为单位)? 而且,当我渲染的东西,我可以渲染他们在,这意味着渲染在几乎在游戏窗口的中间?

  • 问题内容: 根据文档,使用默认缓冲区大小,而第二个构造函数允许设置缓冲区大小。 public BufferedReader(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入流。 但是,文档没有提到默认的缓冲区大小是多少。 BufferedReader的默认缓冲区大小是多少? 问题答案: 默认缓冲区大小为8192个字符 http://developer.android.com/ref

  • 根据文档,使用默认缓冲区大小,而第二个构造函数,允许设置缓冲区大小。 公共缓冲区读取器(读取器输入) 创建使用默认大小的输入缓冲区的缓冲字符输入流。 但是,文档没有提到默认缓冲区大小。 BufferedReader的默认缓冲区大小是多少?

  • 问题内容: 当我使用一些线程将数据写入单个文件时遇到问题。 我设置的缓冲区大小,但是无论设置多少,当缓冲区为8192(默认缓冲区大小)而不是我设置的大小(此处为16384)时,它都会将数据刷新到磁盘。我的代码有问题吗? 这就是我构建的方式: 这是完整的代码: 问题答案: 我通过使用OutputStream而不是writer解决了问题,这是代码: