2016-07-21 10 views
0

を使用してnodejsで任意のサイズのバッファを取得する方法。私は非常に大きな画像を読み込むと、私はあなたがline 679 of nan.h here私は順番にノードとのインターフェースにナンを使用<a href="https://github.com/lovell/sharp" rel="nofollow">sharp</a>を使用して、大容量のファイルにいくつかの画像処理を行うノードjsのアプリケーションを持っているナン

を見ることができます

node: ../node_modules/nan/nan.h:679: Nan::MaybeLocal<v8::Object> Nan::NewBuffer(char*, size_t, node::Buffer::FreeCallback, void*): Assertion `length <= imp::kMaxLength && "too large buffer"' failed. Aborted (core dumped)

を言うナンからのエラーを取得しかし、要約には、この意見:

// arbitrary buffer lengths requires // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION assert(length <= imp::kMaxLength && "too large buffer");

私が持っています

$ node -v v4.4.6

であなたが見ることができる

は、任意の長さのバッファを提供し、IOJS_3_0_MODULE_VERSIONよりも新しいバージョンでなければなりません。しかし、アサーションは#ifdefで囲まれていません。 nanを使用するときに、任意の長さのバッファを使用する方法を知っていますか?

+0

それはバッファする必要がありますか? libvips(シャープな画像処理ライブラリ)は、メモリにロードせずにディスクファイルから直接多くのフォーマットを処理できます。 – user894763

+0

このアプリケーションでは、私はむしろそれがバッファーであると思います。 – matth

+0

@ lovell-full、どんなアイデアですか? – user894763

答えて

1

NANのメンテナは、ノードの以前のバージョン(discussion)の限界にこだわりを意味するように思われ、ノードのすべてのバージョンにわたって均一な動作を提供します。私はそれが新しいバージョンのために大きなバッファを可能にするその周りに#ifdef sがないと仮定します。

NANを使用せずにバッファにメモリを割り当てると、現在のkMaxLengthは0x7fffffff(つまり、NANがそれに制限されている余分なギガバイト)まで上がることができます。

size_t len = 0x7fffffff; 
char* bigbuf = (char*)malloc(len); 
node::Buffer::New(v8::Isolate::GetCurrent(), bigbuf, len); 

私はどこパイプラインで、あなたがこれを打つしているかわからない - あなたはディスクから読んでいるとき、それを何ですか?これらのテクニックのいくつかは役に立ちます:

  • データをストリームで処理します。
  • C++からI/Oを行う。ファイルチャンク単位からデータを読み取る
  • kMaxLengthは、使用可能な最大メモリー量ではなく、最大索引数です。したがって、C++またはストリームデータハンドラ(typedarray.setを使用)の中から大きなバッファをより広いTypedArrayに読み込むことができれば、例えば返すことができます。 0x7fffffff-length Uint32Arrayは8,589,934,588バイトを消費します。

    // Not tested 
    var fs = require("fs"); 
    var path = "/path/to/file"; 
    var size = fs.statSync(path).size; 
    var dest = new Uint32Array(size/Uint32Array.BYTES_PER_ELEMENT); 
    var destOffset = 0; 
    var rs = fs.createReadStream(path); 
    rs.on("data", function (chunk) { 
        var hunk = new Uint32Array(chunk.buffer, chunk.byteOffset, b.byteLength); 
        dest.set(hunk, destOffset); 
        destOffset += hunk.length; 
    }); 
    
+0

ありがとうございました。この質問を投稿した後、ストリームを使用するためにアプリケーションを書き直しました。 – matth

関連する問題