我对StreamReader的缓冲区使用有疑问.在这里:http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx你可以看到:
"当从Stream读取时,使用与流的内部缓冲区大小相同的缓冲区会更有效."
根据这个博客,StreamReader的内部缓冲区大小是2k,所以我可以使用Read()避免来有效地读取一些kbs的文件Read(Char[], Int32, Int32).
而且,即使文件很大,我也可以构造StreamReader传递缓冲区的大小
那么外部缓冲区的需求是什么?
这个问题不止一次被问过,但我在任何讨论中都没有找到满意的答案.
我正在启动一个命令行过程,它可以对STDOUT进行实时测量,大约每秒产生一个新结果.使用System.Diagnostics.Process.StandardOutput导致完全不可接受的延迟(超过20秒),因为STDOUT数据通过Process.StandardOutput StreamReader中的4k缓冲区工作,并且似乎没有任何方法可以解决这个问题.
调用Process.StandardOutput.BaseStream.Flush()不起作用.
我试过对Process.StandardOutput进行逐字节同步读取,但是我仍然比实际输出落后4k.
任何人都可以至少验证我有可能以某种方式克服我重定向STDOUT时遇到的所有缓冲问题,并且一旦它出现在shell窗口中就会立即收到我的应用程序中的数据吗?我可以继承Process类并更改StandardOutput流读取器的行为吗?我是否需要查看原始的WINAPI呼叫?
不知何故,这必须要完成,即使我最终编写非托管C++来启动任务并使用输出,并将其连接起来.任何帮助都非常感谢; 我的智慧结束了......
编辑:看来我需要的是可用于C/C++,Perl,Python和Java的"期望"库的.Net实现(这是迄今为止我发现的唯一库).有谁知道这样的野兽是否存在?
在我的应用程序中,我正在尝试合并已排序的文件(当然保持它们排序),因此我必须遍历两个文件中的每个元素以将最小值写入第三个.这对大文件来说非常慢,只要我没有看到任何其他选择(迭代必须完成)我正在尝试优化文件加载.我可以使用一些RAM,我可以用它来缓冲.我的意思是不是每次读取两个文件中的4个字节,而是每次读取100Mb之类的东西,然后使用该缓冲区,直到缓冲区中没有元素,然后我将再次重新填充缓冲区.但我想ifstream已经这样做了,它会给我更多的表现吗?有什么理由吗?如果fstream有,也许我可以改变那个缓冲区的大小?
添加
我当前的代码看起来像那样(伪代码)
// this is done in loop
int i1 = input1.read_integer();
int i2 = input2.read_integer();
if (!input1.eof() && !input2.eof())
{
if (i1 < i2)
{
output.write(i1);
input2.seek_back(sizeof(int));
} else
input1.seek_back(sizeof(int));
output.write(i2);
}
} else {
if (input1.eof())
output.write(i2);
else if (input2.eof())
output.write(i1);
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢的是
你能建议改进吗?
谢谢.
我需要在Python中将标准输入切换到非缓冲模式,以便我可以读取它的单个字符.我设法让它工作,但现在标准输出被打破:不知何故,似乎在换行符后,发出一些空格字符,第一行为零,第二行为3,第三行为6,等等,这样:
ASD
ASD
ASD
Run Code Online (Sandbox Code Playgroud)
操作系统是Ubuntu Linux 12.04,64位版本,Python版本是3.2.3.
我怎样才能摆脱这种行为呢?
以下是我用过的代码:
import sys
import tty
import termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
tty.setraw(sys.stdin)
for i in range(0, 10):
print("ASD")
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
Run Code Online (Sandbox Code Playgroud) 我试图使用ffmpeg将udp流转换为帧.我运行以下命令:
ffmpeg -loglevel debug -strict 2 -re -i "udp://192.168.15.50:3200?fifo_size=1000000&overrun_nonfatal=1" -r 8 -vf scale=432:243 -f image2pipe -vcodec ppm pipe:1
Run Code Online (Sandbox Code Playgroud)
它发生在不同的流类型,mpeg2video和h264.核心处理此特定流的CPU负载低于30%,其低质量sd流的分辨率为640x576.
它适用于大多数时间,但有时,偶尔会发生延迟,帧会在稍后到达.所以我想要8 fps,但有时我会更少,有时甚至更多.
为什么会出现这种延迟?如何减少延迟?
更新:我尝试将其更改为:
ffmpeg -loglevel debug -i "udp://192.168.15.50:3200?fifo_size=1000000&overrun_nonfatal=1" -r 8 -preset ultrafast -fflags nobuffer -vf scale=432:243 -f image2pipe -vcodec ppm pipe:1
Run Code Online (Sandbox Code Playgroud)
但我仍然遇到了这个问题.例如,在ffmpeg日志中我得到:
[2016/02/11 13:32:30] frame= 7477 fps=8.0 q=-0.0 size= 2299638kB time=00:15:34.62 bitrate=20156.4kbits/s dup=7 drop=15867 ^M*** dropping frame 7477 from stream 0 at ts 7475
[2016/02/11 13:32:30] ***dropping frame 7477 from stream 0 at ts 7476
[2016/02/11 13:32:30] ***dropping frame 7478 …Run Code Online (Sandbox Code Playgroud) 像这样的片段
# Contents of ./run
my $p = Proc::Async.new: @*ARGS;
react {
whenever Promise.in: 5 { $p.kill }
whenever $p.stdout { say "OUT: { .chomp }" }
whenever $p.ready { say "PID: $_" }
whenever $p.start { say "Done" }
}
Run Code Online (Sandbox Code Playgroud)
像
./run raku -e 'react whenever Supply.interval: 1 { .say }'
Run Code Online (Sandbox Code Playgroud)
我希望看到类似的东西
PID: 1234
OUT: 0
OUT: 1
OUT: 2
OUT: 3
OUT: 4
Done
Run Code Online (Sandbox Code Playgroud)
但我看到
PID: 1234
OUT: 0
Done
Run Code Online (Sandbox Code Playgroud)
我知道这与缓冲有关:如果我将该命令更改为类似
# The $|++ disables buffering
./run perl …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个应用程序,我必须将媒体文件(音频和视频)流式传输到浏览器.我正在通过php读取文件并将数据发送到浏览器.我使用以下代码.
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Content-Type: {$file->getMimetype()}");
header("Content-Disposition: inline; filename=".$filename.";");
header("Content-Length: ".strlen($file_content));
echo $file_content;
Run Code Online (Sandbox Code Playgroud)
除了我尝试转发视频或音频时(我的意思是假设当前播放位置为0:15并且它直接转到1:25),媒体停止并且当我再次按下播放按钮时,每件事情都工作得很好从头开始.
我认为问题在于缓冲,但无法弄清楚.我在标题中做错了什么或需要别的东西.
谢谢.
是否有可能通过javascript检测到youtube缓冲的完成?这里http://code.google.com/intl/de-DE/apis/youtube/js_api_reference.html有很多方法,但没有人有"完成缓冲"的事件.
在PHP中有时候我会看到:
$html = <<<HTML
<p>Hello world</p>
HTML;
Run Code Online (Sandbox Code Playgroud)
通常我会使用ob_start():
ob_start();
?>
<p>Hello world</p>
<?php
$html = ob_get_contents();
ob_clean();
Run Code Online (Sandbox Code Playgroud)
你能告诉我这两种写入缓冲区的方式和它们的优点有什么区别吗?
每次交换缓冲区时,重用对象实例与创建新实例之间有什么区别和缺陷?
背景:
这是我的游戏引擎项目.
我正在写一个TripleBuffer,我有三个版本的每个对象:旧版本,当前版本和未来版本.将通过从当前版本读取状态并将更改应用于将来的版本来对这些对象进行更改.在对所有对象进行更改后(如果适用),将交换缓冲区:将来的对象成为当前对象,当前对象成为旧对象,还是旧对象?
说明:
使用案例:
假设大约1000个对象以30Hz交换,这意味着它们需要每秒重建30次,方法是克隆现有的对象,或者重用现在过时的旧对象(覆盖其所有状态).
它们的复杂程度可以从大约5个属性到数百个属性,并且总是具有至少2个级别的深度.
(深度至少为2级 =缓冲对象本身只包含其他唯一对象的地图,这些对象组成了它们)
重新创建和重用都需要迭代当前对象及其组件(短于:反过来构成它们的对象).
进一步考虑:
在引擎的其他部分,将有事件触发和其他魔法,它们将使用对象的及时快照.因此,重新创建或重用的决定将导致: