Data.table: Ukuran SHM melebihi Kesalahan

Dibuat pada 14 Jul 2017  ·  3Komentar  ·  Sumber: Rdatatable/data.table

Permintaan fitur, periksa ukuran /dev/shm untuk melihat apakah cocok dengan ukuran mmap. Dalam kasus saya, saya menggunakan R di dalam wadah buruh pelabuhan dan ukuran default untuk /dev/shm adalah 64M. Ketika kode melakukan mmap pada aliran pipa (seperti dengan hadoop fs -cat /myfile.csv) itu hanya akan membaca byte ukuran shm dari pipa ke mmap. Itu tidak melaporkan kesalahan melalui api C yang saya duga normal. Namun, debugging mengapa fread mengeluh tentang format file mengakibatkan penyelaman mendalam ke dalam kode R dan C data.table untuk menemukannya menggunakan mekanisme ini. Kesalahan dilaporkan (pesan acak berdasarkan di mana pipa saya terputus):

 (ERROR):Expected sep (',') but ' ' ends field 0 when detecting types from point 10: 14183667

Ini dapat direproduksi dengan melakukan hal berikut:

  • Buat file yang berukuran ~5 mcg dari /dev/shm
  • Sesuaikan /dev/shm ke sesuatu seperti 64M (ini adalah default untuk wadah Docker)
  • Jalankan fread di "cat ~/myfile.csv" <-- cat menciptakan pipa
  • Docker V1.12+
  • Centos gambar terbaru dari docker hub
  • R-buka v3.4.0 (microsoft)

Dalam kode: https://github.com/Rdatatable/data.table/blob/master/src/fread.c
Sekitar baris 788 mungkin harus memeriksa ukuran /dev/shm untuk melihat apakah itu cocok dengan file yang baru saja dibaca ke dalam memori. Dalam kasus saya di buruh pelabuhan di sini adalah keluaran verbose dari kondisi pengujian yang gagal:

 > dat.df3<-fread("/opt/cloudera/parcels/CDH/bin/hadoop fs -cat /user/tcederquist/tim_pop_comm_14_5 | head -3668850" ,sep=",", header=TRUE, verbose=TRUE)
 Input contains no \n. Taking this to be a filename to open
 File opened, filesize is 0.062500 GB.
 Memory mapping ... ok
 ....basic output
 Type codes (point  8): 1111
 Type codes (point  9): 1111
 (ERROR):Expected sep (',') but ' ' ends field 0 when detecting types from point 10: 14183667

Hasil yang diharapkan:

 File opened, filesize is 0.373524 GB.

Selain itu, ketika gagal, ia mengetahui secara internal baris # dan informasi berguna lainnya ketika gagal. Saya harus membidik nilainya dengan tangan sebelum saya menemukan flag verbose. Alangkah baiknya jika pesan kesalahan normal menunjukkan baris #. vebose=T menunjukkan lokasi ketika menghitung # pembatas seperti untuk kasus uji ini akan menjadi keluaran yang berguna pada kesalahan (karena saya tahu file tersebut memiliki catatan 20 juta):

 Count of eol: 3668839 (including 0 at the end)
 nrow = MIN( nsep [11006514] / (ncol [4] -1), neol [3668839] - endblanks [0] ) = 3668838
fread

Komentar yang paling membantu

Kawan, saya yang melaporkan zUMIS/19 . Saya sudah mencoba dev 1.10.5 Anda dan berfungsi dengan baik. Kerja bagus teman-teman!

Semua 3 komentar

Bagi siapa pun yang menemukan masalah yang sama, perbaikan jangka pendek adalah meningkatkan ukuran memori bersama dari wadah atau di OS Anda jika /dev/shm Anda terlalu kecil. Biasanya OS modern menggunakan 50% dari memori yang tersedia. Dalam contoh 64G amazon ec2 saya, saya mengatur wadah buruh pelabuhan untuk digunakan:

 docker run --shm-size="30g" ... other stuff ...

Sepakat. Maaf tentang itu.
Perubahan terbaru dalam dev adalah ini dari berita :

Disk Ram (/ dev/shm) tidak lagi digunakan untuk output dari input perintah sistem. Meskipun lebih cepat saat bekerja, itu menyebabkan terlalu banyak kesalahan perangkat penuh; misalnya #1139 dan zUMI/19. Terima kasih kepada Kyle Chung atas laporannya. Standar tempdir() sekarang digunakan. Jika Anda ingin menggunakan disk ram, setel TEMPDIR ke /dev/shm; lihat ?tempdir.

Silakan coba dev 1.10.5 dan buka edisi baru jika masih bermasalah.

Kawan, saya yang melaporkan zUMIS/19 . Saya sudah mencoba dev 1.10.5 Anda dan berfungsi dengan baik. Kerja bagus teman-teman!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat