MongoDB: 插入数据时报错,terminate called in shell()
PHP中文网
PHP中文网 2017-04-24 09:10:13
0
1
790

处理的是一个.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
PHP中文网
PHP中文网

认证0级讲师

全員に返信(1)
小葫芦

ご報告ありがとうございます。

まず、スタック トレースは 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 スクリプトが必要なのか知りたいのですが、何をしようとしているのか教えていただければ、より洗練された解決策があるかもしれません。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート