比如上传文件为1g,服务端可能空间不够。 所以要提前占用一个空间1g,如果不够,就报错。 fs模块有什么相关的方法吗?
获取磁盘剩余大小?,
来自酷炫的 CNodeMD
本楼纯属胡扯,找答案请跳至5楼后半部分
fs.writeFile(file, Buffer.allocUnsafe(1024*1024*1024), cb)
@zswnew 这样不太合适。比如服务器还有5g空间,有三个客户上传文件,每个2g。就会出现问题
@dislido 好的,谢谢啊。我看了,Buffer.allocUnsafe最大只能分配2g内存。
- 那对于大于2g的数据要提前占位应该怎么办呢?
- 还有如果多个用户(比如10)同时上传的话,每个用户通过Buffer.allocUnfafe分配1g的话,那服务器就要分配10g内存吗? node能调用的内存大小有限制吗?
谢谢啊
@yuwanlin 可以复用同一个buffer,然后appendFile
const file_1g = Buffer.allocUnsafe(1024*1024*1024);
fs.writeFileSync('./tmp', file_1g);
fs.appendFileSync('./tmp', file_1g);
// ...
实际使用时建议根据需要创建适当大小的buffer,然后复用它们 node能使用的内存是有限制的(默认不到2G)
如果能用C++模块的话可以直接申请出指定大小的磁盘空间,node我暂时没找到相同的实现
找到了… 测试了一下,秒创建而且不占用额外内存,上面的方法可以作废了
const fd = fs.openSync('./tmp','w+');
fs.writeSync(fd, '\0', 1024*1024*1024*8); // 8G
fs.closeSync(fd);
@dislido 哇,谢谢老哥,这样果然可以的。因为这样是直接写磁盘是吧,不用经过内存
。。。还真的去分配那么大的Buffer写入,无语,蛋疼。。。
现成 fs.truncate / fs.truncateSync 难道不好使吗?
@myy 这个函数没试过。。这个和fs.writeSync(fd, ‘\0’, fileSize)有什么区别吗 我在官网没看到关于truncate的解释