2012-03-28 8 views
2

長時間リーダー、初めてのポスター。node.jsのMemcacheがさまざまなサイズのオブジェクトを返しています

OS X 10.7でノードv0.6.6を使用しています。私はまだ他の環境でこれを試していません。 http://imgur.com/NuaK4を(および他の多くのJPGは、これを行う):私は次のコードを使用する場合(console.log()によって報告されるように)https://github.com/elbart/node-memcache

は、dataがランダムにこのイメージにつながる、いくつかのより多くのバイトが含まれています。私は、このクライアントを使用しています。 faviconはOKと思われ、HTML/CSS/javascriptはすべて動作します。

つまり、私が画像を要求した場合、画像が正しく戻される時間の約70%です。残りの30% - dataは、さらに数バイトを報告し、イメージはブラウザで壊れて表示されます。

client.get(key, function(err, data) { 
    if (err) throw err; 
    if (data) { 
     res.writeHead(200, {'Content-Type': type, 'Content-Length': data.length}); 
     console.log('Sending with length: ' + data.length); 
     res.end(data, 'binary'); 
    } 
}); 

私は数時間にわたりこれを乱しています。私は正直言って私が困惑しています。私は誰かが私の方法で私にエラーを見せることを望んでいる。 memcacheでバイナリデータを適切に保存する方法があるかどうか検索しましたが、関連する情報はありません。

追加情報:さまざまなJPGイメージで発生します。すべての画像はファイルサイズが100〜300KB程度です。たとえば、次のサイズが286442,286443,286441という1つのイメージが報告されています。この問題は、ディスクからデータを直接読み取ってノードで処理すると発生しません。

ありがとうございます。

ノードのバージョンを更新しても問題は解決しません。実際のテストソースの写真と壊れた写真は、下記の私のコメントにあります(stackoverflowはリンクを許可していません)。

+0

同じピクチャの破損していないバージョンを参照することはできますか?また、あなたのノードのバージョンをアップグレードしようとすると、ノードがバッファをどのように扱うかのバグかもしれませんね? – nak

+0

ご回答いただきありがとうございます。ノードのバージョンを更新しても問題は解決しません。実際のテストソース写真:http://imgur.com/XUTf2;実際のテストの壊れた写真:http://imgur.com/NuaK4 – joneszach

+0

私は2つのファイルで 'vbindiff'を実行しました。ここでは破損が始まる場所があります:http://i.imgur.com/gqTKW.png ...そして方法私の唯一のアイデアの腐敗のルール。 memcacheのバグかもしれません。私はそれを自分で使ったことはありません。新しいバージョンがあればRedisを試してみるか、Memcacheを更新することをお勧めします。申し訳ありませんが、私はもっと助けになることはできませんでした! – nak

答えて

2

Elbartのnode-memcacheは、Steve Campbellが示唆するように、バイナリ値を正しく処理しません。node-memcacheはクライアントにバッファへの直接アクセスを与えません。バッファをストリング化すると、バイナリデータが破損します。

「mc」npmを使用してください。 (npm install mc)

警告:私は 'mc' npmの著者です。私はmemcacheのテキストプロトコルよりもバイナリ値を扱うために特別に記述しました。

+0

ありがとうございます。私のmemcache問題の一時的な解決策として、私はキャッシュとして 'var cache = {}'を使用しました。私は、javascriptのローカル変数にオブジェクトを格納し始めました。これまで〜250MBのデータと4K個のオブジェクトを格納するのに最適です。私の質問:これをやって何が間違っていますか?他の場所でオブジェクトにアクセスする必要はありません。私は必要なものをキャッシュすることによってあまりにも多くのメモリ使用量を打つべきではありません。 – joneszach