0

Node.js アプリケーションにメールで (クラウド サービス プロバイダーの Mandrill 経由で) 画像が送られてきます。画像は base64 でエンコードされた文字列 (以下の例では email.content) として取得されます。現在、画像をバッファに書き込んでから、次のようなファイルを書き込んでいます:

//create buffer and write to file
var dataBuffer = new Buffer(email.content, 'base64');                        
var writeStream = fs.createWriteStream(tmpFileName);

writeStream.once('open', function(fd) {
    console.log('Our steam is open, lets write to it');
    writeStream.write(dataBuffer);
    writeStream.end();
}); //writeSteam.once('open')

writeStream.on('close', function() {
    fileStats = fs.statSync(tmpFileName);

これは正常に動作し、すべて問題ありませんが、メモリ内にイメージを (元の文字列として) 保持しているため、コードのこのセクションのメモリ要件を本質的に 2 倍にしてから、同じ文字列のバッファを作成してから、ファイル?大量のインバウンド画像を処理するので、メモリ要件が 2 倍になることが懸念されます。

email.content をストリームに直接書き込むいくつかの方法を試しましたが、常に無効なファイルが生成されました。私は最新のコーディングのアマチュアなので、理由を教えてくれる限り、この懸念はまったく根拠がないことを教えてください。

ありがとう!

4

2 に答える 2

2

ファイル全体が既にメモリ内にあるため、書き込みストリームを作成しても意味がありません。使うだけfs.writeFile

fs.writeFile(tmpFileName, email.content, 'base64', callback)
于 2013-01-11T04:35:31.920 に答える
1

@Jonathanの答えは、すでに持っているコードを短縮するためのより良い方法なので、必ずそうしてください。

ただし、メモリに関する質問について詳しく説明します。Buffer実際、Node.js は最初のファイルに変換せずにファイルに何も書き込むことemail.contentはありません。

ただし、これについて本当に心配している場合はemail.content、ストリームとして取得している場所からの値を処理する何らかの方法が必要になります。次に、データがサーバーにストリーミングされると、すぐにファイルに書き込むので、必要以上に RAM を消費しません。

さらに詳しく説明していただければ、より多くの情報を記入することができます。

于 2013-01-11T04:57:55.497 に答える