我尝试使用protobuf序列化一个torchTensor,似乎使用BytesIO沿着torch.save()不起作用。我尝试过:
BytesIO
torch.save()
import torch import io x = torch.randn(size=(1,20)) buff = io.BytesIO() torch.save(x, buff) print(f'buffer: {buff.read()}')
无济于事,因为它导致输出中的b''!我应该如何进行这件事?
b''
rlcwz9us1#
在阅读之前,您需要将seek移至缓冲区的开头:
seek
import torch import io x = torch.randn(size=(1,20)) buff = io.BytesIO() torch.save(x, buff) buff.seek(0) # <-- this is what you were missing print(f'buffer: {buff.read()}')
给你这个惊人的输出:
buffer: b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x12\x00archive/data.pklFB\x0e\x00ZZZZZZZZZZZZZZ\x80\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\nFloatStorage\nq\x02X\x0f\x00\x00\x00140417054790352q\x03X\x03\x00\x00\x00cpuq\x04K\x14tq\x05QK\x00K\x01K\x14\x86q\x06K\x14K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08\xf3\x08u\x13\xa8\x00\x00\x00\xa8\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x0e\x00archive/data/140417054790352FB\n\x00ZZZZZZZZZZ\xba\xf3x?\xb5\xe2\xc4=)R\x89\xbfM\x08\x19\xbfo%Y\xbf\x05\xc0_\xbf\x03N4\xbe\xdd_ \xc0&\xc4\xb5?\xa7\xfd\xc4?f\xf1$?Ll\xa6?\xee\x8e\x80\xbf\x88Uq?.<\xd8?{\x08\xb2?\xb3\xa3\xba>q\xcd\xbc?\xba\xe3h\xbd\xcan\x11\xc0PK\x07\x08A\xf3\xdc>P\x00\x00\x00P\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x003\x00archive/versionFB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xf3\x08u\x13\xa8\x00\x00\x00\xa8\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00archive/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00A\xf3\xdc>P\x00\x00\x00P\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00archive/data/140417054790352PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x01\x00\x00archive/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xd7\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xc5\x00\x00\x00\x12\x02\x00\x00\x00\x00'
ctehm74n2#
使用**BytesIO.getvalue方法。除了seek-ing和read-ing,你也可以使用io.BytesIO对象的getvalue**方法,它在内部执行seek-read并返回存储的字节:
BytesIO.getvalue
read
io.BytesIO
getvalue
In [1121]: x = torch.randn(size=(1,20)) buff = io.BytesIO() torch.save(x, buff) print(f'buffer: {buff.getvalue()}') buffer: b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x12\x00archive/data.pklFB\x0e\\ x00ZZZZZZZZZZZZZZ\x80\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\nFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x0\ 0\x00cpuq\x04K\x14tq\x05QK\x00K\x01K\x14\x86q\x06K\x14K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08\x949f)\x9a\x00\x00\x00\x9a\\ x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00*\x00archive/data/0FB&\x00ZZZZZZZZZZZZZZZ\ ZZZZZZZZZZZZZZZZZZZZZZZ\xff*\x1f\xbfM\xaa\x16?\x9fB\xbd?\x14\xee\xb4\xbe\xbc\x83^>l.\xba>\x8d\xc0\x1f\xbfZ\x06\x03\xbe\xe0(B\xbe^[\xf8\xbeE\x83\x9f\xbfUo\xc0\\ xbd\xbaX\xb7?\x83MH\xbf\xc0\x0c\xbb\xbf\xa4s\xc9?\x84\x8b\xd9\xbf\xa1\x91\xa1\xbf\xc6,\x0c?kxW?PK\x07\x08/\n\x02&P\x00\x00\x00P\x00\x00\x00PK\x03\x04\x00\x00\\ x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x003\x00archive/versionFB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\ ZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x949f)\x9a\x00\x00\x00\x9a\x00\x00\x00\x1\ 0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00archive/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00/\n\x02&P\x00\x\ 00\x00P\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00archive/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x0\ 0\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x01\x00\x00archive/versionPK\x06\x06,\x00\x00\x00\\ x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x\ 12\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xc9\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xb7\x00\x00\ \x00\x12\x02\x00\x00\x00\x00'
getvalue对于任何io.StringIO对象也是一样的,但是它返回的不是字节,而是存储的字符串,正如预期的那样。
io.StringIO
2条答案
按热度按时间rlcwz9us1#
在阅读之前,您需要将
seek
移至缓冲区的开头:给你这个惊人的输出:
ctehm74n2#
使用**
BytesIO.getvalue
方法。除了
seek
-ing和read
-ing,你也可以使用io.BytesIO
对象的getvalue
**方法,它在内部执行seek
-read
并返回存储的字节:getvalue
对于任何io.StringIO
对象也是一样的,但是它返回的不是字节,而是存储的字符串,正如预期的那样。