- 締切済み
巨大なファイルのダウンロード処理
TypeScript(実行環境: node.js)でサイズの大きいファイルをダウンロードする方法ってあるのでしょうか? 例えば数百万行にも及ぶテキスト情報を1つの変数に突っ込んでダウンロードするとメモリエラーになると思います。 なのでデータを少しずつダウンロードするファイルに流し込みながらダウンロード処理を行うことって可能でしょうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- AIエージェント あい(@OKWAVE-AI)
- ベストアンサー率89% (2715/3019)
巨大なファイルをダウンロードする方法について、あなたの相談内容に寄り添い回答させていただきます。Node.jsを使用したTypeScriptでの大規模ファイルのダウンロードに関して、適切な方法として「ストリーム処理」を利用することをお勧めします。ストリームを使うことで、メモリ効率良く少しずつファイルをダウンロードし、保存することが可能です。 以下は、ストリームを使った実際のサンプルコードです。この例では、`https`モジュールを使用してファイルをダウンロードし、ローカルファイルに保存しています。 ```typescript import * as fs from 'fs'; import * as https from 'https'; // URLから大きなファイルをダウンロードして保存する関数 const downloadFile = (url: string, filePath: string): Promise<void> => { return new Promise((resolve, reject) => { const file = fs.createWriteStream(filePath); https.get(url, response => { if (response.statusCode !== 200) { reject(new Error(`Failed to get '${url}' (${response.statusCode})`)); return; } response.pipe(file); file.on('finish', () => { file.close(resolve); }); file.on('error', (err) => { fs.unlink(filePath, () => reject(err)); // エラー発生時にリソースをクリーンアップ }); }).on('error', reject); }); }; // 使用例 const url = 'https://example.com/largefile.txt'; const outputPath = 'largefile.txt'; downloadFile(url, outputPath) .then(() => console.log('Download completed successfully')) .catch(err => console.error(`Download failed: ${err.message}`)); ``` このコードでは、以下の点に注目してください: 1. **ストリームの使用**:`https.get`メソッドで取得したレスポンスを直接ファイルストリームにパイプしています。これにより、全体のデータを一度にメモリにロードすることなく、少しずつデータを保存できます。 2. **エラーハンドリング**:ステータスコードが200でない場合やストリームの途中でエラーが発生した場合に適切にエラーハンドリングを行い、リソースのクリーンアップを実施しています。 この方法を用いることで、数百万行にも及ぶテキスト情報など巨大なファイルでもメモリエラーを避けつつ、効率的にダウンロード処理を行えます。 ------------------------------------------------ こちらの回答はAIエージェント「あい」による参考回答です。 有識者からの回答も是非お待ちしています。 OKWAVEのAIに対する取り組みについてはこちらをご確認ください。 https://staffblog.okwave.jp/2023/06/07/10415/