javascript - fs writeFile 在完成写入文件之前冻结
问题描述
我的代码即时运行 600kB 文件...700kB 文件,在 800kB 时它突然挂起并且没有结束。
每次将块写入缓冲区时,我都会打印出来。(65536 是 2^16,大概是每个块的大小。)
var bufs = [];
var count = 0;
readStream.on('data', function(d){ bufs.push(d);
count += 65536;
console.log(count/1000 + "k" + "/ 800k");
});
readStream.on('end', function(){
var buf = Buffer.concat(bufs);
console.log(buf);
fs.writeFile("test.jpg", buf, ()=>{console.log('hi')});
});
我明白了:
5:04:02 PM web.1 | 65.536k/ 800k
5:04:02 PM web.1 | 131.072k/ 800k
5:04:02 PM web.1 | 196.608k/ 800k
5:04:02 PM web.1 | 262.144k/ 800k
5:04:02 PM web.1 | 327.68k/ 800k
5:04:02 PM web.1 | 393.216k/ 800k
5:04:02 PM web.1 | 458.752k/ 800k
5:04:02 PM web.1 | 524.288k/ 800k
5:04:02 PM web.1 | 589.824k/ 800k
5:04:02 PM web.1 | 655.36k/ 800k
5:04:02 PM web.1 | 720.896k/ 800k
5:04:02 PM web.1 | 786.432k/ 800k
5:04:02 PM web.1 | 851.968k/ 800k
这意味着它到了最后,但readStream.on('end'...
没有触发。所以实际的 fs writeFile 实际上并没有发生。
之前我问了一个问题How to make fs writeFile for a image faster?因为我认为它挂了,因为我效率低下。我得到了一些关于直接从读取流写入的好答案,而不是打扰缓冲区(感谢@jfriend00 和@Randy Casburn):
readStream.pipe(fs.createWriteStream("test.jpg"));
readStream.on('end', () => {
console.log("all done now");
});
但它仍然挂起,完全相同的行为,大小约为 800kB。
解决方案
推荐阅读
- rebus - 使用 Rebus 的 BuiltinHandlerActivator 和应用程序请求的生命周期
- javascript - 包含相关数据 EF Core 时出现 Ajax 错误
- java - 如何修复“没有可用类型的合格 bean:预计至少有 1 个有资格作为自动装配候选者的 bean
- javascript - 单元测试时出错-TypeError:无法读取未定义的属性“cityWeather”
- r - 如何从 ggplot 中的 facet_grid 中删除空条?
- python - 这可能吗:将虚拟环境克隆到每个用户的笔记本电脑,而源代码和相关文件保留在网络驱动器中
- c++ - 如何在 winApi 上正确创建按钮并处理其消息
- python - 如何在 kivy 中的形状之间添加填充?
- android-10.0 - Android Q Edge to Edge 应用内容不显示透明导航栏
- java - restTemplate.getForObject 上的 HttpClientErrorException