我试图在Windows上找到与stdout相关的数据限制的一些信息.我似乎无法在MSDN上找到相关信息.
可以将多少数据写入stdout是否有限制?如果是这样,如果达到限制会发生什么?数据丢失了吗?
如果重定向stdout(例如,通过从.Net启动进程并使用ProcessStartInfo.RedirectStandardOutput属性),这对可以写入多少数据有影响吗?当我从调用过程中的stdout流中读取时,这是否会影响限制?
这些限制是否与命名管道有关?
我正在从一个文件中读取数据,遗憾的是,这种文件有两种类型的字符编码.
有一个标题和一个正文.标头始终为ASCII,并定义正文编码的字符集.
标头不是固定长度,必须通过解析器运行以确定其内容/长度.
该文件也可能非常大,所以我需要避免将整个内容带入内存.
所以我开始使用单个InputStream.我最初使用带有ASCII的InputStreamReader包装它并解码标头并提取主体的字符集.都好.
然后我创建一个具有正确字符集的新InputStreamReader,将其放在同一个InputStream上并开始尝试读取正文.
不幸的是,javadoc证实了这一点,即InputStreamReader可能会选择提前读取以达到效率目的.因此,标题的阅读会咀嚼身体的一部分/全部.
有没有人有解决这个问题的建议?会手动创建一个CharsetDecoder并一次输入一个字节但是一个好主意(可能包含在自定义的Reader实现中吗?)
提前致谢.
编辑:我的最终解决方案是编写一个没有缓冲的InputStreamReader,以确保我可以解析标题而不会咀嚼身体的一部分.虽然这不是非常有效,但我使用BufferedInputStream包装原始InputStream,因此它不会成为问题.
// An InputStreamReader that only consumes as many bytes as is necessary
// It does not do any read-ahead.
public class InputStreamReaderUnbuffered extends Reader
{
private final CharsetDecoder charsetDecoder;
private final InputStream inputStream;
private final ByteBuffer byteBuffer = ByteBuffer.allocate( 1 );
public InputStreamReaderUnbuffered( InputStream inputStream, Charset charset )
{
this.inputStream = inputStream;
charsetDecoder = charset.newDecoder();
}
@Override
public int read() throws IOException
{
boolean middleOfReading = false;
while ( true …
Run Code Online (Sandbox Code Playgroud) 例如,假设我有一个缓冲区char journal_name[25]
,我用它来存储日志名称.现在假设在代码中稍后几行我想将某人的名字存储到缓冲区中.我应该去char person_name[25]
还是只是重用journal_name[25]
?
麻烦的是,每个阅读代码的人(以及几周之后我也必须了解journal_name
)现在实际上是person_name
.
但是反驳的论点是拥有两个缓冲区会增加空间使用量.所以最好使用一个.
你怎么看待这个问题?
谢谢,Boda Cydo.
我正在处理COM端口应用程序,我们有一个定义的可变长度数据包结构,我正在与微控制器通信.数据包具有开始和停止字节的分隔符.麻烦的是,有时读缓冲区可能包含无关的字符.看起来我总是得到整个数据包,只是在实际数据之前/之后的一些额外的喋喋不休.所以我有一个缓冲区,只要从COM端口收到新数据,我就会附加数据.搜索此缓冲区以查找可能出现的数据包的最佳方法是什么?例如:
说我的数据包分隔符是0xFF
,我有一个数组
{ 0x00, 0xFF, 0x02, 0xDA, 0xFF, 0x55, 0xFF, 0x04 }
Run Code Online (Sandbox Code Playgroud)
如何创建一个函数/ LINQ-statment来返回以分隔符开头和结尾的所有子数组(几乎就像带有通配符的滑动相关器)?
该示例将返回以下3个数组:
{0xFF, 0x02, 0xDA, 0xFF}, {0xFF, 0x55, 0xFF}, and
{0xFF, 0x02, 0xDA, 0xFF, 0x55, 0xFF}
Run Code Online (Sandbox Code Playgroud) 假设场景:udp数据包流到达机器X,机器X正在运行两个程序 - 一个正在侦听带有recv()的数据包,另一个正在运行pcap.
在这种情况下,据我所知,数据包存储在接口中,直到它由内核轮询,然后将内核移动到内核内存中的缓冲区,并将数据包复制到另外两个缓冲区 - 一个缓冲区用于程序使用recv监听,并使用pcap监听程序的一个缓冲区.数据包在读取时从相应的缓冲区中删除 - 通过pcap_next()或recv(),下次进程调度程序运行它们(我假设它们在这种情况下阻塞).它是否正确?是否真的使用了4个缓冲区,还是以其他方式处理?
我正在寻找尽可能详细的描述,关于在这种情况下真正涉及哪些缓冲区,以及数据包如何从一个移动到另一个(例如,数据包在进入recv缓冲区之前被复制到pcaps缓冲区,之后或未定义?).
我知道这似乎是一个很大的问题,但我真正关心的是数据包的存储位置以及数据存储的时间长短.子弹点很好.理想情况下,我想要一个通用的答案,但如果它在OS之间变化我对Linux最感兴趣.
我正在阅读有关Java IO的一些文档,只是想确定我是否正确:
无缓冲输入流:FileInputStream,InputStreamReader,FileReader
无缓冲输出流:FileOutputStream,OutputStreamWriter,FileWriter
缓冲输出流:PrintStream,PrintWriter
此外,我们还有BufferedInputStream,BufferedOutputStream,BufferedReader和BufferedWriter流,可将无缓冲的流转换为缓冲版本.
最后,我观察到了Character Streams,即.InputStreamReader,FileReader,OutputStreamWriter,FileWriter,在将字节发送到流之前为字节维护内部字节缓冲区.这个字节缓冲区不在我们的控制之下.因此,对于Character Streams,缓冲是指用于存储进出程序的字符的高级字符缓冲区.
我说的一切都是正确的吗?
PS - 我知道这个缓冲问题在某种程度上依赖于实现,但我只是想确认一下javadocs在说什么
Linux UDP接收缓冲区的最大大小是多少?我认为它仅限于可用的RAM,但是当我设置时
rmem_max为5GB:
echo 5000000000 > /proc/sys/net/core/rmem_max
Run Code Online (Sandbox Code Playgroud)
和4GB的实际套接字缓冲区(在Erlang中):
gen_udp:listen(Port, [{recbuf, 4000000000}])
Run Code Online (Sandbox Code Playgroud)
当我测量缓冲区利用率时,它显示:
# netstat -u6anp | grep 5050
udp6 1409995136 0 :::5050 :::* 13483/beam.smp
Run Code Online (Sandbox Code Playgroud)
我不能超过这个1.4GB.对于较小的缓冲区大小,例如500MB,实际缓冲区大小与配置的值匹配.我的系统是Debian 6.0,机器有50GB RAM可用.
我正在尝试构建一个实时语音呼叫应用程序.我的目标是使用本机JS麦克风api并通过websocket将数据发送到其他客户端.我想出了以下代码:
<script>
// Globals
var aCtx;
var analyser;
var microphone;
navigator.getUserMedia_ = ( navigator.getUserMedia
|| navigator.webkitGetUserMedia
|| navigator.mozGetUserMedia
|| navigator.msGetUserMedia);
if (navigator.getUserMedia_) {
navigator.getUserMedia_({audio: true}, function(stream) {
aCtx = new webkitAudioContext();
analyser = aCtx.createAnalyser();
microphone = aCtx.createMediaStreamSource(stream);
microphone.connect(analyser);
process();
});
};
function process(){
console.log(analyser);
setInterval(function(){
FFTData = new Float32Array(analyser.frequencyBinCount);
analyser.getFloatFrequencyData(FFTData);
console.log(FFTData); // display
},10);
}
</script>
Run Code Online (Sandbox Code Playgroud)
所以每隔10ms我就会得到缓冲区并通过节点发送.问题是我无法弄清楚如何播放缓冲区,我甚至不确定我是否以正确的方式获得缓冲区.我试过了:
var source = audioContext.createBufferSource();
var buffer; // the result printed in the code below
var audioBuffer = audioContext.createBuffer(1, buffer.length, 44100);
audioBuffer.getChannelData(0).set(buffer);
source.buffer = …
Run Code Online (Sandbox Code Playgroud) 是否可以在Chrome(和Opera)中完全缓冲HTML5视频?
我在亚马逊S3上以.mp4和.webm的形式主持电影.在HTML中我使用标准<video>
标签.服务器以状态响应206 Partial Content
.这很棒,因为它允许浏览器下载视频的任何部分,但我需要能够立即搜索文件的任何部分.
我试过了:
.PROGRESS
事件.当Chrome停止缓冲第一部分时,连接将被终止.下一部分是以新连接方式下载的,因此JavaScript无法继续检查下载的总数据.即使可能,旧数据也不会存储在缓存中.此方法适用于Firefox和Safari.哎呀,即使在IE10中!XHRS
.我可以完全下载电影,但是当视频开始播放时,Chrome会尝试再次从服务器下载电影.我甚至试图将这部电影传递给base64中的HTML,但那是很多数据FileAPI
.Chrome无法创建足够大的BLOB并崩溃.欢迎任何帮助!
PS.我知道od和类似的问题,但我希望自从他们被问到后会有所改变.
我将一列Json数据传递给脚本组件进行处理.它一直很好,直到我有一个包含超过600,000长度的Json数据,然后发生跟随错误.
我确实将MaxBuffer大小更改为10MB,我的数据只有600K左右,但它仍然不起作用,请咨询.