处理的是一个.js文件,中间包含大量insert命令和update命令。一个命令占一行。
文件大小为222M.
错误信息如下:
我猜测可能是因为单条命令太长的缘故,但是用mongo直接处理.js文件按理说不会有这样的问题才对吧
系统是debian 32位,版本2.6.32-5-386
在stackoverflow和segmentfault找,也只看到有人遇到堆栈信息中是_ZN5开头的。
在64位mongodb上运行成功了。
但是64位加载2.3G文件的时候又有错误,好在这次有明确信息了。
拆成200多M的文件就能处理了。
很奇怪,我在mongodb文档中没看到说有这种限制啊
connecting to: localhost/test
tcmalloc: large alloc 2364833792 bytes == 0x2658000 @
2014-08-19T21:49:28.069-0400 Assertion: 16569:In File::read(), ::pread for 'univ100-100.js' read 2147479552 bytes while trying to read 2364826029 bytes starting at offset 0, truncated file?
2014-08-19T21:49:28.164-0400 0x864f81 0x813579 0x7f6f86 0x7f74dc 0x80a61f 0x79781d 0x61f12a 0x621f63 0x3ff161ecdd 0x61a049
mongo(_ZN5mongo15printStackTraceERSo+0x21) [0x864f81]
mongo(_ZN5mongo10logContextEPKc+0x159) [0x813579]
mongo(_ZN5mongo11msgassertedEiPKc+0xe6) [0x7f6f86]
mongo() [0x7f74dc]
mongo(_ZN5mongo4File4readEmPcj+0x30f) [0x80a61f]
mongo(_ZN5mongo5Scope8execFileERKSsbbi+0x61d) [0x79781d]
mongo(_Z5_mainiPPcS0_+0x52a) [0x61f12a]
mongo(main+0x33) [0x621f63]
/lib64/libc.so.6(__libc_start_main+0xfd) [0x3ff161ecdd]
mongo(__gxx_personality_v0+0x469) [0x61a049]
exception: In File::read(), ::pread for 'univ100-100.js' read 2147479552 bytes while trying to read 2364826029 bytes starting at offset 0, truncated file?
real 0m7.922s
user 0m0.045s
sys 0m2.477s
高洛峰2017-04-24 09:12:13
ご報告ありがとうございます。
まず、スタック トレースは gcc によってマングルされ、デマングラーを使用して逆に見ることができます。
サーバーがシェルと同様に 2.6.3 であると仮定すると、問題は直接的にここにあります。シェルはスクリプト ファイル全体をメモリに読み込み、それをコンパイルします。32 上の 2.3G ファイルに問題があると説明できます。 -ビットマシン。ただし、64 ビット マシンでは問題が発生することはありません。
ここで質問が2つあります。
1. 32 ビット オペレーティング システムと互換性を持たせるには、JS ファイルのサイズを 2G に制限する必要があります。現在のロジックは正しいですが、上限が大きすぎて説明と一致しません。
2. ファイルを読み取るとき、システムは 1 回の pread
呼び出しでファイルが読み込まれることを常に保証できないため、終了するかエラーが発生するまで file.cpp で複数回読み取ることが最善です。
問題が明確になったことを願っています。一時的な解決策は、先ほどと同じように、ファイルをより小さな部分に分割することです。発生している問題を英語で簡単に説明して、この問題を Jira で送信していただければ幸いです。カーネル エンジニアは将来の開発でこの問題を改善します。また、Jira でこの問題を追跡することもできます。ご都合が悪い場合は、私が提出させていただきます。
より良い方法は、Jira でレポートを送信した後、Github で MongoDB コードをフォークし、変更してプル リクエストを送信することです。カーネル エンジニアはコードをレビューし、最終的にコード ベースにマージします。この問題は比較的まれで、比較的独立しており、比較的明確であるため、小さなタスクを完了した後にプル リクエストを送信するのに非常に適しています。そうすれば、世界中の MongoDB ユーザーがあなたが書いたコードを実行することになります。中国には MongoDB ユーザーが非常に多いため、私たちは MongoDB コミュニティに貢献する能力があると思います。他にご質問がございましたら、お知らせください。
追記:なぜ 2.3G スクリプトが必要なのか知りたいのですが、何をしようとしているのか教えていただければ、より洗練された解決策があるかもしれません。