Nodejs对于大文件分片的思考
发布于 6 年前 作者 HyperClockUp 4031 次浏览 来自 问答

nodejs中对于大文件一般是用stream来操作的,但是对于更大的文件,处理还是很耗时间。所以我就想能不能用子进程结合fs.createReadStrem的方式,使用其中的start,end来进行文件分片,再交由子进程读取后使用process.send发给主进程。但是自己写的代码发现往往比单进程还要耗时,请问我这样的思考方向有问题吗?另外,现在我学nodejs纯粹是想到哪写到哪,请问有没有什么好的nodejs书籍或者在线学习的地方推荐?劳烦各位解疑了,谢谢。

7 回复

没意义, 瓶颈不在于nodejs, 瓶颈在于磁盘的读取速度

@151263 你好,我对于Nodejs底层的IO机制不是很清楚。Nodejs读文件是异步IO,交由线程池处理,但是我查了很多资料这一块没有很详细。线程池应该也是单线程读取文件再异步返回结果的吧,那这个读取的速度不知道是磁盘的上限还是某些特殊限定,如果是后者的话应该是可以通过多线程也就是多进程来提高读取效率的吧?不知道我这么理解对不对

@HyperClockUp sata接口速度和磁盘寻道速度恒定,操作系统早就想到这点了,加1000个线程也没用,你的多线程可以更好地降低磁盘读写速度,使大文件读取变成更慢的 4K 随机读取。

这块唯一需要注意的是 由于写入速度普遍慢于获取数据(磁盘读取、网络读取、内存读取) 的速度,会造成大量数据驻留在内存里,此时你可以考虑使用管道。 rxjs 对于流的操作也十分方便。

@zuohuadong 你的多线程可以更好地降低磁盘读写速度,使大文件读取变成更慢的 4K 随机读取 这句话不是很能理解,希望您能解释一下,我在自己写代码的时候,确实想到了读取的速度远远大于写入的速度,但是我现在还没处在应用阶段,我只是简单的想尝试是否能够提升读取效率,在 https://blog.csdn.net/yhhwatl/article/details/53311214 这篇文章中用到了回调函数来限定读取速度的办法,我在后面会尝试一下,但目前想确定的是我这么做是否合理。因为目前在看多进程这块,觉得很有意思,所以想尝试一下使用多进程来处理文件。

@HyperClockUp 磁盘随机读写的速度远远低于 大文件读写。总速度其实是一定的,多线程得不断切换,降低了速度。

关于限制读取速度,这块最实用的方式是管道。

还有一个问题别忽略了:跨进程 IPC 通讯是比较耗时的操作

@atian25 对,这点我体会到了,传输次数越多越耗时。也就是说我这个思路没有必要去实现了吧,理论上都行不通

回到顶部