1

クロスプラットフォーム スクリプトの一部を node.js に移植することを考えています。これは、一部は node.js を学習するためであり、一部は最近 JavaScript に慣れているためであり、一部は他のスクリプト言語での大きなファイルのサポートに関する問題のためです。

一部のスクリプト言語は、32/64 ビット OS またはプロセッサで実行されているかどうか、または特定のフラグを使用して特別にコンパイルする必要があるかどうかなどに応じて、大きなファイル オフセットを不完全にサポートしているようです。

とにかくnode.jsを試してみたいのですが、グーグルでは、64ビットオフセットを持つ大きなファイルのサポート(またはライブラリ/フレームワークのサポートなど)について、どちらの方法もあまり見つけられません。

これは、少なくとも JavaScript の基本的な整数サポートにある程度依存することを認識しています。JavaScript の Max Int とは何ですか?を正しく読んだ場合 Number が精度を落とさずに到達できる最大の整数値は? JavaScriptは整数に対しても内部的に浮動小数点を使用しているようです。

最大の正確な積分値は 2 53です

次に、node.js はサーバー向けであり、サーバーは大きなファイルのサポートを期待する必要があります。

node.js は 64 ビットのファイル オフセットをサポートしていますか?


アップデート

_LARGEFILE_SOURCEおよびビルド フラグにもかかわらず、_FILE_OFFSET_BITSこれを必要とするプロジェクトの移植を開始したので、それはfs.read(files.d.fd, chunk, 0, 1023, 0x7fffffff, function (err, bytesRead, data)成功するが で0x80000000失敗することがわかりましたEINVAL。これは、v0.6.1132 ビット Windows 7 で動作するバージョンです。

今のところ、これが のみの制限なのかfs、node.js のバグなのか、Windows ビルドのみの問題なのかはわかりません。

すべてのプラットフォームのすべてのコア モジュールの node.js で、31 ビットを超えるファイル オフセットが機能することを意図していますか?

4

2 に答える 2

1

追跡するのは少し困難でしたが、node.jsは、2012年5月末からのバージョン0.7.9(不安定)以降、64ビットファイルオフセットのみをサポートしています。バージョン0.8.0からの安定バージョンでは、6月末から2012年。

fs:fs呼び出しの64ビットオフセット(Igor Zinkovsky)

以前のバージョンでは、より大きなオフセットを使用する場合の失敗モードでは、失敗モードは、ファイルの先頭をサイレントにシークすることから、。を使用して例外をスローすることまでさまざまですEINVAL

(現在は閉じられている)バグレポートを参照してください。

31ビットを超えるファイルオフセットはサポートされていません

node.jsコードからプログラムでラージファイルサポートを確認するには

if (process.version.substring(1).split('.') >= [0,7,9]) {
  // use 64-bit file offsets...
}
于 2012-12-25T02:56:08.383 に答える
1

Node.js は、すべてのプラットフォームで _LARGEFILE_SOURCE および _FILE_OFFSET_BITS を使用してコンパイルされるため、内部的には大きなファイル アクセスに対して安全なはずです。(common.gypiソース ディレクトリのルートにある を参照してください。)

ライブラリに関しては、読み取りおよび書き込みストリームを作成するときにstart(およびend) オプションに Number を使用します (fs.createReadStream を参照)。これは、ノードを介して 2^53 の位置までアドレス指定できることを意味します (ここで証明されているように: また関連: What is JavaScript's maximum integer value that an Number can go to without loss precision? ) これはlib/fs.jsコードに表示されます。

于 2012-12-01T18:42:56.453 に答える