久久精品五月,日韩不卡视频在线观看,国产精品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來進行文件的讀?。?/p>

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請求獲取文件大?。?/p>

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久久| 亚洲免费成人| 亚州精品视频| 免费亚洲婷婷| 欧美日韩一二| 黄色亚洲精品| 日韩高清不卡在线| 久久中文欧美| 欧美日韩视频| 国产伦精品一区二区三区视频 | 国产一区二区三区网| 欧美13videosex性极品| 丝袜美腿高跟呻吟高潮一区| 国产日韩欧美三级| 日韩综合精品| 亚洲人www| 国产高潮在线| 午夜视频一区二区在线观看| 国产精品久久久久蜜臀| 欧美日一区二区| 日韩二区在线观看| 日本韩国欧美超级黄在线观看| 在线精品视频一区| 久久电影tv| 亚洲毛片网站| 久久久久久久久丰满| 久久激情av| 亚洲韩日在线| 国产精品一卡| 午夜在线一区二区| 国产一区二区三区黄网站| 亚洲精品在线观看91| 国产精品视频一区二区三区| 亚洲黄页一区| 免费亚洲婷婷| 中文字幕亚洲精品乱码| 美女网站视频一区| 亚洲制服一区| 日韩高清欧美| 国产亚洲精品精品国产亚洲综合| 亚洲二区免费| 国产福利一区二区三区在线播放| 在线一区免费| 激情中国色综合| 日韩二区三区在线观看| 激情91久久| а√天堂8资源中文在线| 日韩精品导航| 夜夜嗨一区二区| 四虎成人av| 欧美日韩中文| 巨乳诱惑日韩免费av| 久久蜜桃资源一区二区老牛| 日本a级不卡| 国产精品腿扒开做爽爽爽挤奶网站| 精品国产一区二区三区噜噜噜| 亚洲尤物av| 在线亚洲精品| 久久久久欧美精品| 动漫av一区| 国产精品传媒麻豆hd| 亚洲三级在线| 麻豆久久精品| 99成人在线| 免费在线小视频| 国产精品亚洲欧美日韩一区在线 | 久久亚洲人体| 欧美亚洲色图校园春色| 久久午夜精品| 亚洲免费在线| 亚洲午夜在线| 久久狠狠婷婷| 日韩欧美另类一区二区| 欧美成人一二区| 国产精品观看| 国产精品乱战久久久| 欧美在线精品一区| 蜜臀av性久久久久蜜臀aⅴ流畅 | 欧美aaaaaa午夜精品| 日本aⅴ精品一区二区三区| 影院欧美亚洲| 亚洲精品1区2区| 91成人超碰| 久久中文字幕av| 亚洲91久久| 图片区亚洲欧美小说区| 免费av一区二区三区四区| 亚洲a在线视频| 欧美69视频| 久久精品国内一区二区三区水蜜桃| 亚洲伦乱视频| 久久久久国产精品一区三寸| 99久精品视频在线观看视频| 蜜桃tv一区二区三区| 五月天久久网站| 亚洲免费影视| 日韩av一区二区三区四区| 日韩av一区二区三区| 国产日产精品_国产精品毛片| 欧美片第1页综合| 国际精品欧美精品| 日韩中文字幕高清在线观看| 视频二区不卡| 狠狠色综合网| 亚州精品视频| 国产精品一级| 日韩欧美一区二区三区免费看| 激情欧美国产欧美| 午夜久久av| 国产成人精品一区二区免费看京 | 国产极品一区| 日韩在线观看| 欧美精品一卡| 日韩美女国产精品| 免费精品一区| 免费成人网www| 日韩高清不卡一区二区| 精品高清久久| 一区免费在线| 国产亚洲字幕| 色一区二区三区| 视频精品一区二区| 你懂的国产精品永久在线| 在线视频观看日韩| 日韩黄色在线观看| 日本美女一区| 亚洲三级观看| 日韩av免费大片| 午夜在线视频一区二区区别| 国产精品久久久久久久久久齐齐| 中文字幕在线视频网站| 中文字幕一区二区精品区| 精品视频黄色| 午夜在线视频一区二区区别 | 日韩精品乱码av一区二区| 国产一区二区三区四区五区| 西西人体一区二区| av中文资源在线资源免费观看| 亚洲视频二区| 四虎4545www国产精品 | 国产一区二区三区日韩精品| 亚洲激情偷拍| 国内在线观看一区二区三区| 香蕉视频成人在线观看| 精品美女视频 | 九色porny丨国产首页在线| 中文字幕av一区二区三区人| 国产成人精品一区二区免费看京| 午夜在线视频观看日韩17c| 精品五月天堂| 日韩精品三区四区| 久久精品国产www456c0m| 97久久亚洲| 日韩午夜电影| 福利在线免费视频| 欧美日韩亚洲一区在线观看| 国产亚洲毛片在线| 日本综合字幕| 久久免费视频66| 亚洲精品免费观看| 四虎884aa成人精品最新| 国产欧美三级| 喷白浆一区二区| 亚洲夜间福利| 日韩免费福利视频| 国产一区二区色噜噜| 欧美午夜三级| 日本 国产 欧美色综合| 亚洲国产专区| 三级精品视频| 色网在线免费观看| 福利一区和二区| 国产激情一区| 国产欧美日韩亚洲一区二区三区| 石原莉奈在线亚洲二区| 欧美一区三区| 999视频精品| av高清一区| 桃色av一区二区| 成人在线丰满少妇av| 国产精品嫩模av在线| 亚洲精品观看| 最新国产精品视频| 亚洲精一区二区三区| 亚洲一区av| 亚洲精品高潮| 日本成人中文字幕| 日韩精品乱码av一区二区| 日韩一二三区在线观看| 亚洲精品福利| 日本亚洲最大的色成网站www |