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

处理的是一个.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级讲师

membalas semua(1)
小葫芦

Terima kasih banyak atas laporan anda.

Pertama sekali, surih tindanan dihancurkan oleh gcc dan boleh dilihat secara terbalik menggunakan demangler.
Dengan mengandaikan bahawa pelayan anda adalah 2.6.3 seperti shell, masalahnya terletak secara langsung di sini Shell akan membaca keseluruhan fail skrip ke dalam memori dan kemudian menyusunnya Ia boleh dijelaskan bahawa terdapat masalah dengan fail 2.3G -mesin bit. Tetapi ia tidak sepatutnya menyebabkan masalah pada mesin 64-bit.

Ada dua soalan di sini.
1. Saiz fail JS hendaklah dihadkan kepada 2G agar serasi dengan sistem pengendalian 32-bit. Logik semasa adalah betul, tetapi had atas terlalu besar dan tidak sepadan dengan penerangan.
2. Apabila membaca fail, sistem tidak boleh sentiasa menjamin bahawa ia akan dibaca dalam satu pread panggilan, jadi sebaiknya baca beberapa kali dalam file.cpp sehingga ia tamat atau ralat berlaku.

Semoga saya menjelaskan masalahnya. Penyelesaian sementara ialah melakukan apa yang anda lakukan dan memecahkan fail kepada kepingan yang lebih kecil. Alangkah baiknya jika anda boleh menyerahkan isu ini dalam Jira, hanya menerangkan masalah yang anda hadapi dalam bahasa Inggeris. Jurutera kernel akan menambah baiknya dalam pembangunan masa hadapan, dan anda juga boleh menjejaki isu ini pada Jira. Jika ia menyusahkan anda, saya boleh menyerahkannya untuk anda.

Cara yang lebih baik ialah dengan memotong kod MongoDB pada Github selepas menyerahkan laporan tentang Jira, mengubah suainya dan kemudian menyerahkan Permintaan Tarik Jurutera Kernel akan mengodkannya semula dan akhirnya menggabungkannya ke dalam pangkalan kod. Oleh kerana masalah ini agak jarang berlaku, agak bebas dan agak jelas, adalah sangat sesuai untuk menyerahkan Permintaan Tarik selepas menyelesaikan tugasan kecil. Kemudian pengguna MongoDB di seluruh dunia menjalankan kod yang anda tulis. Saya fikir memandangkan terdapat begitu ramai pengguna MongoDB di China, kami mempunyai keupayaan untuk menyumbang kepada komuniti MongoDB. Jika anda mempunyai sebarang soalan lagi, beritahu saya.

P.S. Saya ingin tahu mengapa anda memerlukan skrip 2.3G, jika anda boleh memberitahu saya apa yang anda cuba lakukan, mungkin ada penyelesaian yang lebih elegan.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!