广告
返回顶部
首页 > 资讯 > 前端开发 > html >Nodejs如何进行大文件读写
  • 269
分享到

Nodejs如何进行大文件读写

2024-04-02 19:04:59 269人浏览 安东尼
摘要

这篇文章主要介绍了nodejs如何进行大文件读写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇nodejs如何进行大文件读写文章都会有所收获,下面我们一起来看看吧。一、node

这篇文章主要介绍了nodejs如何进行大文件读写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇nodejs如何进行大文件读写文章都会有所收获,下面我们一起来看看吧。

一、node中的文件读写

1.1 常规文件读写

常规的,如果我们要读取一个比较小的文件,可以直接通过:

const fs = require('fs')
let data = fs.readFileSync("./test.png")
console.log(data,123)
//输出data =

一般而言,同步的方法不是很推荐,因为js/nodejs是单线程的,同步的方法会阻塞主线程。最新版的node直接提供了fs.promise,可以结合async/await直接使用:

const fs = require('fs')
const readFileSync = async () => {
    let data = await fs.promises.readFile("./test.png")
    console.log(data,123)
}
readFileSync()
//输出data =

这里通过异步的方法调用不会阻塞主线程,多个文件读取的io也可以并行进行等。

1.2 Stream文件读写

常规的文件读写,我们会把文件一次性的读取到内存中,这种方法时间效率和内存效率都很低,时间效率低是指必须要一次性读取完毕后才能执行后续才做,内存效率低是指必须把这个文件都一次性读取放入内存中,很占用内存。因此这种情况下,我们一般使用Stream来进行文件的读取:

const fs = require('fs')
const readFileTest = () => {
    var data = ''
    var rs = fs.createReadStream('./test.png');
    rs.on('data', function(chunk) {
        data += chunk;
        console.log(chunk)
     });
    rs.on('end',function(){
        console.log(data);
    });
    rs.on('error', function(err){
        console.log(err.stack);
     });
}
readFileTest()
// data =

通过Steam来进行文件读写,可以提高内存效率和时间效率。

  • 内存效率:在处理数据之前,不需要在内存中加载大量(或整个)数据

  • 时间效率:一旦有了数据,就可以开始处理,这大大减少开始处理数据的时间,而不必等到整个数据加载完毕再进行处理。

Stream的文件还支持第二种写法:

const fs = require('fs')
const readFileTest = () => {
    var data = ''
    var chunk;
    var rs = fs.createReadStream('./test.png');
    rs.on('readable', function() {
    while ((chunk=rs.read()) != null) {
        data += chunk;
    }});
    rs.on('end', function() {
        console.log(data)
    });
};
readFileTest()

二、node文件读写RAM和Blob大小的限制

2.1 基础问题

在读取大文件时,会有读取文件大小的限制,比如我们现在在读取一个2.5G的视频文件:

const fs = require('fs')
const readFileTest = async () => {
    let data = await fs.promises.readFile("./video.mp4")
    console.log(data)
}
readFileTest()

执行上述的代码会报错:

RangeError [ERR_FS_FILE_TOO_LARGE]: File size (2246121911) is greater than 2 GB

我们可能会想到,通过设置option,NODE_OPTIONS='--max-old-space-size=5000',此时5000M>2.5G,但是报错还是没有消失,也就是说通过Options无法改变node读取文件的大小限制。

上述是常规的方式读取大文件,如果通过Steam的方式读取还会有文件大小的限制嘛? 比如:

const fs = require('fs')
const readFileTest = () => {
    var data = ''
    var rs = fs.createReadStream('./video.mp4');
    rs.on('data', function(chunk) {
        data += chunk;
     });
    rs.on('end',function(){
        console.log(data);
    });
    rs.on('error', function(err){
        console.log(err.stack);
     });
}
readFileTest()

如上方式读取一个2.5G的文件不会有异常,不过要注意的是这边有一个报错:

data += chunk;
                ^

RangeError: Invalid string length

此时是因为data的长度超过了最大限制,比如2048M等。因此在用Steam处理的时候,在对读取结果的保存时,要注意文件的大小,千万不能超过默认的Buffer的最大值。上述这种情况,我们不用data += chunk将数据全部保存在一个大的data中,我们可以边读取边处理。

2.2 分片读取

createReadStream在读取文件的过程中,其实也可以分段读取,这种分段读取的方法也可以做为大文件读取的备选项。特别是在并发读取的时候有一定的优点,可以提升文件读取和处理的速度。

createReadStream接受第二个参数{start,end}。我们可以通过fs.promises.stat来获取文件的大小,然后确定分片,最后分片一次读取,比如:

  1. 获取文件大小

const info = await fs.promises.stat(filepath)
   const size = info.size

登录后复制

  1. 按照指定的SIZE分片(比如128M一个分片)

  const SIZE = 128 * 1024 * 1024
  let sizeLen = Math.floor(size/SIZE)
    let total = sizeLen +1 ;
    for(let i=0;i<=sizeLen;i++){
      if(sizeLen ===i){
        console.log(i*SIZE,size,total,123)
        readStremfunc(i*SIZE,size,total)
      }else{
        console.log(i*SIZE,(i+1)*SIZE,total,456)
        readStremfunc(i*SIZE,(i+1)*SIZE-1,total)
      }
    }
  //分片后【0,128M】,【128M, 256M】...

3.实现读取函数

const readStremfunc = () => {
    const readStream =  fs.createReadStream(filepath,{start:start,end:end})
    readStream.setEncoding('binary')
    let data = ''
    readStream.on('data', chunk => {
        data = data + chunk
    })
    readStream.end('data', () => {
      ...
    })
}

值得注意的是fs.createReadStream(filepath,{start,end}),start和end是前闭后闭的,比如fs.createReadSteam(filepath,{start:0,end:1023})读取的是[0,1023]一共1024个bit。

三、其他

3.1 扩展浏览器端的大文件读写

前面将了大文件在nodejs中的读取,那么在浏览器端会读取大文件会有什么问题吗?

浏览器在本地读取大文件时,之前有类似FileSaver、StreamSaver等方案,不过在浏览器本身添加了File的规范,使得浏览器本身就默认和优化了Stream的读取。我们不需要做额外的工作,相关的工作:GitHub.com/whatwg/fs。不过不同的版本会有兼容性的问题,我们还是可以通过FileSaver等进行兼容。

3.2 请求静态资源大文件

如果是在浏览器中获取静态资源大文件,一般情况下只需要通过range分配请求即可,一般的CDN加速域名,不管是阿里云还是腾讯云,对于分片请求都支持的很好,我们可以将资源通过cdn加速,然后在浏览器端直接请求cdn加速有的资源。

分片获取cdn静态资源大文件的步骤为,首先通过head请求获取文件大小:

const getHeaderInfo = async (url: string) => {
  const res: any = await axiOS.head(url + `?${Math.random()}`);
  return res?.headers;
};
const header = getHeaderInfo(source_url)
const size = header['content-length']

我们可以从header中的content-length属性中,获取文件的大小。然后进行分片和分段,最后发起range请求:

const getRangeInfo = async (url: string, start: number, end: number) => {
    const data = await axios({
      method: 'get',
      url,
      headers: {
        range: `bytes=${start}-${end}`,
      },
      responseType: 'blob',
    });
    return data?.data;
  };

在headers中指定 range: bytes=${start}-${end},就可以发起分片请求去获取分段资源,这里的start和end也是前闭后闭的。

关于“Nodejs如何进行大文件读写”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Nodejs如何进行大文件读写”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网html频道。

--结束END--

本文标题: Nodejs如何进行大文件读写

本文链接: https://www.lsjlt.com/news/98931.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Nodejs如何进行大文件读写
    这篇文章主要介绍了Nodejs如何进行大文件读写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Nodejs如何进行大文件读写文章都会有所收获,下面我们一起来看看吧。一、node...
    99+
    2022-10-19
  • Nodejs中如何读写文件
    本篇内容主要讲解“Nodejs中如何读写文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Nodejs中如何读写文件”吧!操作文件是服务端一个基础的功能,也是做...
    99+
    2022-10-19
  • 深入解析Nodejs中的大文件读写
    目录前言一、node中的文件读写1.1 常规文件读写1.2 Stream文件读写二、node文件读写RAM和Blob大小的限制2.1 基础问题2.2 分片读取三、其他3.1 扩展浏览...
    99+
    2022-11-13
  • nodejs中怎么对json文件进行读写操作
    nodejs中怎么对json文件进行读写操作,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。nodejs 读json文件var&...
    99+
    2022-10-19
  • 深入解读Python如何进行文件读写
    open Python提供了非常方便的文件读写功能,其中open是读写文件的第一步,通过open读写文件的方式和把大象装冰箱是一样的 f = open("test.txt",'w...
    99+
    2022-11-12
  • 如何在Python中进行文件读写操作
    如何在Python中进行文件读写操作文件是我们存储和处理数据的重要工具之一。在Python中,通过文件读写操作可以实现数据的输入和输出,方便我们对数据进行分析、处理和存储。本文将介绍如何在Python中进行文件读写操作,并提供具体的代码示例...
    99+
    2023-10-27
    文件读取:file_read 文件写入:file_write 文件操作:file_operation
  • python怎么进行文件读与写
    本篇内容主要讲解“python怎么进行文件读与写”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python怎么进行文件读与写”吧!python 进行文件读写的函...
    99+
    2022-10-18
  • python对文件进行读写操作
    先看原理,再动手写程序: python进行文件读写的函数是open或file file_handler = open(filename,,mode) Table mode 模式 描述 r 以读方式打开文件,可读...
    99+
    2023-01-31
    操作 文件 python
  • 如何进行C++ Builder中的文件读写操作
    这期内容当中小编将会给大家带来有关如何进行C++ Builder中的文件读写操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在C++中进行编程时,代码文件的操作是一个经常遇到的问题,在C++ Build...
    99+
    2023-06-17
  • 如何在R语言中对文本文件进行读写
    如何在R语言中对文本文件进行读写?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体如下:read.table(file,sep,hesder)#file 文件路径#s...
    99+
    2023-06-08
  • java进行文件读写操作详解
    在Java中,文件读写操作可以使用Java的输入/输出流(IO)类来实现。Java提供了多种IO类来进行文件读写操作,包括字节流和字...
    99+
    2023-09-14
    java
  • php如何读大文件某几行
    本篇内容介绍了“php如何读大文件某几行”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php读大文件某几行的实现方法:1、直接采用file函...
    99+
    2023-06-25
  • nodejs如何创建简易web服务器与文件读写
    小编给大家分享一下nodejs如何创建简易web服务器与文件读写,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!web服务器至少有...
    99+
    2022-10-19
  • 关于Python中读取写入文件并进行文件
    一、提前知识点 在python中是同样和其他语言一样可以进行文件的读取写入操作,值得注意的是,Python中打开文件读取的方式有几种,分别是以下几种: 1 f = open('username.txt') 2 first_line ...
    99+
    2023-01-30
    文件 Python
  • c语言怎么对文件进行读写
    C语言提供了一组文件操作函数,用于打开、读、写和关闭文件。下面是一个简单的示例,演示了如何对文件进行读写。1. 打开文件:```c#...
    99+
    2023-09-27
    c语言
  • java利用缓冲区及流式对大文件进行高效读写
    当处理大文件时,使用适当的技术和方法可以提高读写性能和效率。下面是一些针对大文件读写的示例说明: 字符流缓冲区及分块读写  BufferedInputStream 和 BufferedOutputStream 大文件读取: try (F...
    99+
    2023-09-14
    java 数学建模 开发语言
  • Linux下如何使用Octave对文件进行读写操作
    小编给大家分享一下Linux下如何使用Octave对文件进行读写操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Octave 是一个 Linux 上类似于 Ma...
    99+
    2023-06-27
  • 如何在Python中使用Numpy进行文件读写操作?
    当我们在使用Python进行科学计算时,Numpy是一个非常重要的工具。它提供了大量的数学函数和数组操作方法,可以让我们更高效地进行数据分析和处理。在本文中,我们将介绍如何使用Numpy进行文件读写操作,并提供一些示例代码。 文件读写操作...
    99+
    2023-06-01
    numpy django 文件
  • nodejs如何创建文件并写入
    这篇文章将为大家详细讲解有关nodejs如何创建文件并写入,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。nodejs创建文件并写入的方法:首先创建一个代码示例文件;然后通过“require('fs...
    99+
    2023-06-14
  • 如何在 Python 中读写二进制文件?
    在 Python 中,读写二进制文件是一项基本的任务。二进制文件通常包含非文本数据,例如图像、音频、视频等。 本文将向您介绍如何在 Python 中读写二进制文件。 什么是二进制文件? 在计算机中,所有数据都以二进制形式存储。二进制文件是一...
    99+
    2023-10-01
    文件 numpy javascript
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作