久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

淺析Nodejs怎么進行大文件讀寫

淺析Nodejs怎么進行大文件讀寫

node.js極速入門課程:進入學習

筆者最近在做一些node端的文件讀寫和分片上傳工作,在這個過程中,發現node讀取的文件如果超過2G,超過了讀取Blob最大值,會出現讀取異常,此外在node中讀寫文件也受服務器RAM的限制等,需要分片讀取,本人記錄一下遇到的問題以及解決問題的經過。【相關教程推薦:nodejs視頻教程】

  • node中的文件讀寫
  • node文件讀寫RAM和Blob大小的限制
  • 其他

一、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也是前閉后閉的。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
韩国精品主播一区二区在线观看 | 国产精品日本一区二区三区在线 | 亚洲性色视频| 欧美亚洲国产精品久久| 亚洲精品99| 免费久久99精品国产| 日本精品国产| 国产一区二区三区探花| 亚洲天堂成人| 日韩中文字幕视频网| 美女久久久久久 | 美女被久久久| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩不卡免费视频| 国产精品呻吟| 麻豆精品99| 蜜臀国产一区| 亚洲少妇在线| 国产欧美久久一区二区三区| 久久av一区二区三区| 青青草国产精品亚洲专区无| 国产精品乱战久久久| 国产一区二区视频在线看| 国产亚洲一区二区三区啪| av资源中文在线天堂| 亚洲中字黄色| 欧美a在线观看| 日韩视频在线一区二区三区 | 黄色网一区二区| 五月天久久久| 国产精品高潮呻吟久久久久| 国产一二在线播放| 在线一区免费观看| 国产精品白丝久久av网站| 桃色一区二区| 日韩高清在线不卡| 三上悠亚国产精品一区二区三区| 欧美一区=区| 欧美日韩午夜电影网| 亚洲成av在线| 国产精品综合色区在线观看| 久久亚洲成人| 国产精品超碰| 免费看日韩精品| 亚洲黄色中文字幕| 亚洲免费福利一区| 国产福利91精品一区二区| 亚洲精品一二三区区别| 国产精品入口久久| 免费日韩av片| 欧美黄色网页| 欧美日韩一区二区高清| 黄色亚洲在线| 日韩88av| 国产欧美一区二区三区精品观看| 极品日韩av| 欧美国产偷国产精品三区| 日韩av电影一区| 亚洲在线成人| 日韩精品网站| 美女免费视频一区| 免费美女久久99| 成人精品久久| 日本午夜大片a在线观看| 麻豆精品av| 另类欧美日韩国产在线| 一区二区亚洲视频| 999国产精品| 蜜臀av免费一区二区三区| 麻豆中文一区二区| 免费成人性网站| 日韩亚洲精品在线| 91精品国产91久久久久久黑人| 麻豆精品视频在线观看视频| 国产免费av一区二区三区| 国产剧情在线观看一区| 国产精品国码视频| 精品精品99| 欧美日韩尤物久久| 免费污视频在线一区| 麻豆精品蜜桃| 久久亚洲一区| 日韩国产精品久久久| 91欧美极品| 国产精品国产一区| 99久久久久久中文字幕一区| 在线国产一区二区| 婷婷亚洲精品| 国产精品久久久久久久久久10秀| 日韩欧美一区二区三区免费看| 91看片一区| 热久久久久久久| 精品美女视频 | 亚洲欧美日韩综合国产aⅴ| 久久国产精品久久久久久电车| 日韩激情精品| 亚洲黄色网址| 最近国产精品视频| 国产一区二区精品久| 99视频一区| 精品在线网站观看| 丝袜a∨在线一区二区三区不卡| 国产探花一区| 激情综合网站| 国产欧美高清| 中文一区在线| 97精品一区| 日韩国产一区| 欧美日韩一区二区三区四区在线观看| 中文字幕在线高清| 欧美伊人久久| 亚洲免费影视| 日韩精品首页| 国模精品一区| 免费日韩成人| 欧美私人啪啪vps| 久久亚洲色图| 亚洲一区区二区| 亚洲午夜黄色| 97精品国产一区二区三区| 青草综合视频| 日韩欧美中文字幕电影| 久久久一二三| 欧美二三四区| 日韩美女一区二区三区在线观看| 国产精品久久久久77777丨| 日本一不卡视频| 天堂俺去俺来也www久久婷婷| 美女精品在线观看| 一区在线视频观看| 亚洲成人精选| 9久re热视频在线精品| 激情久久中文字幕| 激情五月色综合国产精品| 午夜久久美女| 99pao成人国产永久免费视频| 成人av动漫在线观看| 黄色精品网站| 国产在线不卡| 亚洲综合图色| 欧美国产极品| 中文另类视频| 亚洲字幕久久| 国产精品毛片一区二区在线看| 亚洲毛片一区| 影音国产精品| 日韩精品一卡二卡三卡四卡无卡 | 欧美日韩xxxx| 国产精品日本一区二区不卡视频| 免费看黄色91| 国产精品伦一区二区| av高清不卡| 一二三区精品| 激情久久一区二区| 国产精品88久久久久久| 深夜日韩欧美| 成人午夜毛片| 国产精品视区| 国产精品麻豆成人av电影艾秋| 播放一区二区| 国产精品视频3p| 99日韩精品| 国产一区二区三区国产精品| 图片区亚洲欧美小说区| 亚洲美女91| 日韩欧美一区二区三区在线观看 | 免费在线观看日韩欧美| 91成人福利| 国产在线|日韩| 91大神在线观看线路一区| 在线日韩一区| 国产精品115| 亚洲少妇诱惑| 日韩在线欧美| 欧美亚洲色图校园春色| 日本精品不卡| 欧美黄页在线免费观看| 日本一区免费网站| 亚洲精品午夜av福利久久蜜桃| 精品高清久久| 国产精品jk白丝蜜臀av小说| 蜜桃视频第一区免费观看| 亚洲深夜视频| 国产经典一区| 亚久久调教视频| 人人精品人人爱| 精品1区2区3区4区| 99成人在线| 国产亚洲欧洲| 中文欧美日韩| jiujiure精品视频播放| 人在线成免费视频| 国产精品高颜值在线观看| 精品国产18久久久久久二百| 老司机精品视频网| 精品午夜视频| 亚洲风情在线资源| 精品国产麻豆| 久久天堂精品| 1024精品一区二区三区|