久久精品五月,日韩不卡视频在线观看,国产精品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請求獲取文件大?。?/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综合
亚洲精选成人| 亚洲激情婷婷| 日本不卡的三区四区五区| 欧美女激情福利| 亚洲男女av一区二区| 一区二区三区四区在线看| 高清一区二区三区| 精品国产一区二区三区性色av| 欧美亚洲tv| 国产精品mm| 国产成人久久精品麻豆二区 | 99视频精品视频高清免费| 91综合视频| 日韩一区欧美| 免费污视频在线一区| 欧美日韩在线二区| 99re国产精品| 激情综合激情| 美国三级日本三级久久99| 亚洲精品国产精品粉嫩| 18国产精品| 欧美国产另类| av在线最新| 国内激情久久| 中文字幕亚洲精品乱码| 国产精品手机在线播放| 激情综合五月| 欧美日韩在线网站| 伊人国产精品| 国产精品xxx| 日韩毛片视频| 亚洲欧美日韩国产一区二区| 少妇精品久久久一区二区三区| 久久精品99国产精品| 欧美国产专区| 99久久久久国产精品| 天使萌一区二区三区免费观看| 午夜亚洲福利| 国产精品xx| 香蕉成人久久| 久久不见久久见国语| 久久激情网站| 日韩精品亚洲专区在线观看| 久久精品国产免费| av一区二区高清| 国产亚洲字幕| 国产韩日影视精品| 日韩精品一区二区三区免费视频 | 久久一区亚洲| 亚洲激情av| 国产精品高潮呻吟久久久久| 日韩精品一卡| 日韩精品午夜视频| 麻豆网站免费在线观看| 免费在线观看精品| 黄色精品视频| 亚洲一区欧美| 福利在线免费视频| 亚洲综合婷婷| 成人va天堂| 日韩不卡在线观看日韩不卡视频| 中文在线а√在线8| 婷婷五月色综合香五月| 日韩电影在线视频| 日本午夜精品久久久久| 久久久久中文| 国产精品主播| 亚洲一区二区成人| 国产91在线精品| 日韩黄色av| 91超碰国产精品| 精品国产一级| 亚洲另类av| 99久精品视频在线观看视频| 国产精品亚洲片在线播放| 激情婷婷欧美| 国产一区二区三区免费在线| 亚洲精品伦理| 亚洲激情五月| 最新中文字幕在线播放| 国产欧美日韩一区二区三区四区 | 成人在线免费观看网站| 亚洲欧洲免费| 国产精品99一区二区| 精品久久影院| 热久久久久久| 蜜臀av性久久久久蜜臀aⅴ四虎| 黑森林国产精品av| 国产精品啊v在线| 日韩精品一区二区三区中文在线| 亚洲国产不卡| 久久夜夜操妹子| 精品精品国产三级a∨在线| 婷婷亚洲成人| 老牛影视一区二区三区| 精品中文一区| 韩国精品主播一区二区在线观看 | 国产精品夜夜夜| 日韩精品亚洲专区在线观看| 免费日韩视频| 亚洲视频综合| 日韩电影免费网址| 国产 日韩 欧美 综合 一区 | 成人台湾亚洲精品一区二区| 国产高清亚洲| 欧美日韩一区自拍| 日韩精品国产精品| 综合激情网...| 久久午夜精品| 欧美日韩精品一本二本三本 | 久久不卡日韩美女| 国产精品一级| 国产欧美日韩一级| 91九色综合| 国产日韩一区二区三区在线播放| 免费精品视频在线| 蜜桃免费网站一区二区三区| 国产精品外国| 亚洲欧美视频| 蜜桃成人av| 亚洲高清成人| 不卡在线一区| 日韩午夜黄色| 免费中文字幕日韩欧美| 亚洲一区区二区| 麻豆91精品| 蜜臀av亚洲一区中文字幕| 中文字幕中文字幕精品| 丝瓜av网站精品一区二区| 亚洲欧美网站| 亚洲91网站| 国产精品综合色区在线观看| 欧美经典一区| 给我免费播放日韩视频| 日本久久综合| 精精国产xxxx视频在线播放| 色婷婷狠狠五月综合天色拍| 欧美91福利在线观看| 亚洲综合精品| 日韩成人在线看| 国产精品成人国产| 97人人精品| 亚洲韩日在线| 中文字幕亚洲在线观看| 久久国产乱子精品免费女| 精品伊人久久久| 亚洲天堂免费电影| 好看不卡的中文字幕| 免费看黄色91| 日韩av中文字幕一区二区| 国产亚洲人成a在线v网站| 精品91福利视频| 欧美成人亚洲| 日韩av资源网| 国产一区2区| 婷婷综合五月| 亚洲tv在线| 美女久久久久久| 91精品韩国| 快she精品国产999| 国产欧美88| 日韩免费小视频| 亚洲一区国产| 国产精品成人国产| 久久久男人天堂| 午夜亚洲一区| 美女高潮久久久| 欧美午夜不卡| 国产精品**亚洲精品| 国产在线不卡| 欧美亚洲tv| 尤物tv在线精品| 国产亚洲一区| 色爱综合av| 色婷婷成人网| 成人久久久久| 日韩欧美激情| 日韩在线不卡| 日韩中出av| 成人在线超碰| 亚洲精品人人| 日韩欧美精品| 久久精品97| 精品在线播放| 免费在线欧美黄色| 香蕉成人久久| 国产一区二区三区久久久久久久久| 日韩一级精品| 你懂的网址国产 欧美| 久久av一区二区三区| 国际精品欧美精品| 亚洲综合中文| 香蕉成人av| 国产麻豆精品| 国产综合色产| 久久只有精品| 中文字幕免费精品| 色婷婷久久久| 国产精品嫩模av在线| 国产亚洲毛片|