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