我有一个带有serialize方法的自定义类,我希望能够将此类直接编写到文件中,并serialize在Python 2.6中编写方法的返回值.(我不是想腌制我的物体,这是完全不同的东西.)例如:
class Foo(object):
def serialize(self):
return "Hello World!"
__str__ = serialize
foo = Foo()
f = open("foo.dat", "wb")
f.write(foo)
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,我得到以下异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument 1 must be convertible to a buffer, not Foo
Run Code Online (Sandbox Code Playgroud)
好的,所以我需要我的Foo课来实现buffer界面.我甚至在缓冲区文档中看到它说:"缓冲区接口的示例用户是文件对象的write()方法.任何可以通过缓冲区接口导出一系列字节的对象都可以写入文件."
显然我可以做我想做的事,但是文档实际上并没有说明为了实现缓冲接口我需要实现哪些方法.我已经试过落实__str__,__unicode__,__len__,甚至__sizeof__.我已经实现了__getitem__,__setitem__并且__delitem__接受了这两个int和slice参数.我甚至已经试过落实过时__getslice__,__setslice__和__delslice__ …
我有一个通用的增长缓冲区,用于累积"随机"字符串片段,然后获取结果.处理该缓冲区的代码用简单的C编写.
伪代码API:
void write(buffer_t * buf, const unsigned char * bytes, size_t len);/* appends */
const unsigned char * buffer(buffer_t * buf);/* returns accumulated data */
Run Code Online (Sandbox Code Playgroud)
我正在考虑应该为缓冲区选择的增长策略.
我不知道我的用户是喜欢内存还是速度 - 或者用户数据的性质是什么.
我已经看到了两种策略:按固定大小增量增长缓冲区(这是我目前正在实现的)或以指数方式增长数据.(还有一种策略来分配所需的确切内存量 - 但在我的情况下这并不是那么有趣.)
也许我应该让用户选择策略......但这会让代码变得更复杂......
曾几何时,Herb Sutter 写道(引用Andrew Koenig),最好的策略可能是因子1.5的指数增长(寻找"成长策略").这还是最好的选择吗?
有什么建议?你的经历说什么?
我需要检测视频文件何时完成加载.我想我应该使用progress-> buffer,但在我的脑海中,我记得读到这是不可靠的.有更好的方法,还是这样安全?
请注意,我将保留每个用户已完全下载的视频的localStorage缓存,因此我事先知道视频是否已加载,如果这是一个棘手的问题,可能会绕过进度 - >缓冲区.
提前致谢.
已经有人问过如何.emacs在更改文件后重新加载文件.
建议的解决方案是使用M-x load-file或M-x eval-region RET改变区域.
这些解决方案都不会影响我的其他开放缓冲区.有没有办法.emacs为所有打开的缓冲区重新加载文件?
我还应该注意,由于对该答案M-x load-file的评论中概述的原因,它没有达到预期的效果.
这是我的一个非常基本的问题.在我教授的演讲幻灯片中,有一个我真的不会得到的例子.
她写了:
printf("u");
write(STDOUT_FILENO, "m", 1);
printf("d\n");
Run Code Online (Sandbox Code Playgroud)
......她说这段代码的输出将是:
泥
我不明白.所以,如果有人理解为什么会这样,请向我解释.
参考这个问题:
http://lagoon.cs.umd.edu/216/Lectures/lect17.pdf
Run Code Online (Sandbox Code Playgroud)
(在最后一张幻灯片页面.)
C++具有以下函数来从套接字接收字节,它可以检查MSG_PEEK标志可用的字节数.使用MSG_PEEK,'recv'的返回值是socket中可用的字节数:
#include <sys/socket.h>
ssize_t recv(int socket, void *buffer, size_t length, int flags);
Run Code Online (Sandbox Code Playgroud)
我需要在不创建的buffer情况下获取套接字中可用的字节数(不分配内存buffer).有可能吗?怎么样?
我想帮助递归循环遍历协议缓冲区消息中包含的所有属性/子对象,假设我们不知道它们的名称,或者有多少.
例如,从google网站上的教程中获取以下.proto文件:
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
Run Code Online (Sandbox Code Playgroud)
并使用它...:
person = tutorial.Person()
person.id = 1234
person.name = "John Doe"
person.email = "jdoe@example.com"
phone = person.phone.add()
phone.number = "555-4321"
phone.type = tutorial.Person.HOME
Run Code Online (Sandbox Code Playgroud)
鉴于 …
我Buffer在我的节点服务器和Buffer我的Javacript客户端上使用.
为了节省字节,我希望通过websockets将数据作为二进制文件发送到服务器,而不是JSON.
所以,如果我有Javascript对象[ 5, false, 55, "asdf" ],我想在发送之前将其转换为客户端上的缓冲区.也许是这样的:
object.toBuffer('int16', 'bool', 'int16', 'utf8');
Run Code Online (Sandbox Code Playgroud)
并在服务器上读取它像这样:
var obj = buffer.read('int16', 'bool', 'int16', 'utf8');
Run Code Online (Sandbox Code Playgroud)
我正在寻找当前的解决方案,看起来我可能只需要做很多事情concat,指定字节偏移/长度,从int转换为布尔值等.
有没有更好的办法?
编辑:以下是我认为您目前必须这样做的方式.我想我的问题只是它太冗长和容易出错,而且我正在寻找一种更简洁,更优雅的方法,因为这个操作将在我的代码中的许多不同的地方执行.
// On client for [ 5, false, 55, "test" ]
const writeFirst = Buffer.allocUnsafe(2);
writeFirst.writeInt16LE(5, 0);
const writeSecond = Buffer.allocUnsafe(1);
writeSecond.writeUInt8(0);
const writeThird = Buffer.allocUnsafe(2);
writeThird.writeInt16LE(55, 0);
const writeFourth = Buffer.from('test');
const result = Buffer.concat([writeFirst, writeSecond, writeThird, writeFourth]);
// On server for reading buffer of [ 5, false, …Run Code Online (Sandbox Code Playgroud) 我在localhost上没有任何问题.但是当我在服务器上测试我的代码时,每一页的末尾都会看到这个通知.
我的代码:
<?php
ob_start();
include 'view.php';
$data = ob_get_contents();
ob_end_clean();
include 'master.php';
ob_end_flush(); // Problem is this line
Run Code Online (Sandbox Code Playgroud) 有一个REST端点,它为我的应用程序提供大量(数十千兆字节)的数据块.
应用程序按照自己的步调处理数据,随着传入数据量的增长,我开始达到REST端点超时.
意思是,处理速度低于网络吞吐量.
不幸的是,没有办法提高处理速度,因为没有"足够" - 传入的数据量可能会无限增长.
我正在考虑在处理之前在本地存储传入数据的方法,以便在超时发生之前释放REST端点连接.
我到目前为止所做的是将输入数据下载到临时文件并使用OutputStream/InputStream同时读取(处理)所述文件.
使用文件进行缓冲.
这带来了它自己的问题:
是否有传统方法来做这样的事情?
有替代解决方案吗?
请提供一些指导.
Upd:
我想指出:http服务器不受我的控制.
将其视为供应商数据提供商.他们有很多消费者,拒绝为一个人改变任何东西.
看起来我们是唯一使用其所有数据的人,因为我们的客户端应用程序处理速度远远高于其示例客户端性能指标.尽管如此,我们无法将我们的应用性能与网络吞吐量相匹配.
服务器不支持http范围请求或分页.
没有办法将数据分成块加载,因为没有过滤属性来保证每个块都足够小.
简而言之:我们可以在超时发生之前的给定时间内下载所有数据,但无法处理它.
在输入流和outpustream之间有一个适配器,以pefrorm作为阻塞队列,将有助于一吨.