gpt4 book ai didi

python - 重用 Python Bytearray/Memoryview

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:25 24 4
gpt4 key购买 nike

我正在尝试通过套接字接收一系列 protobuf;我不会提前知道数据量。我发送了相当数量的邮件,需要 buffer the messages当我收到它们时(以确保我收到所有消息)。我想利用 Python 中可用的 bytearray/memoryview 来消除不必要的副本。

我目前正在使用一个字符串并在收到数据时附加数据。这很容易,我可以通过执行以下操作来“转移”“缓冲区”:

# Create the buffer
str_buffer = []

# Get some data and add it to our "buffer"
str_buffer += "Hello World"

# Do something with the data . . .

# "shift"/offset the message by the data we processed
str_buffer = str_buffer[6:]

是否可以使用 bytearray/memoryview 做类似的事情?

# Create the buffer/memoryarray 
buffer = bytearray(1024)
view = memoryview(buffer)

# I can set a single byte
view[0] = 'a'

# I can "offset" the view by the data we processed, but doing this
# shrinks the view by 3 bytes. Doing this multiple times eventually shrinks
# the view to 0.
view = view[3:]

当我尝试向末尾添加更多数据时出现问题。如果我曾经“偏移”现有 View , View 的大小“缩小*”并且我可以添加越来越少的数据。有没有办法重用现有的 memoryview 并将数据左移?

*根据文档,我知道我无法调整数组的大小。我认为缩小的错觉是我的一个误解。

最佳答案

你真的,老实说,不需要提前知道预期有多少数据,只要继续阅读,直到你不再获得任何数据:

import socket, sys

HOST = 'localhost' # The remote host
PORT = 50007 # The same port as used by the server

recvbuff = bytearray(16)
recvview = memoryview(recvbuff)

size = 0

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
nbytes = s.recv_into(recvview)
if not nbytes:
break
size += nbytes
recvview = recvview[nbytes:]
if not len(recvview):
print "filled a chunk", recvbuff
recvview = memoryview(recvbuff)

print 'end of data', recvbuff[:len(recvview)], size

s.close()

关于python - 重用 Python Bytearray/Memoryview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22827794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com