Data.table: تجاوز حجم SHM الخطأ

تم إنشاؤها على ١٤ يوليو ٢٠١٧  ·  3تعليقات  ·  مصدر: Rdatatable/data.table

طلب الميزة ، تحقق من حجم / dev / shm لمعرفة ما إذا كان يتطابق مع حجم mmap. في حالتي كنت أستخدم R داخل حاوية عامل إرساء والحجم الافتراضي لـ / dev / shm هو 64 م. عندما يقوم الكود بعمل mmap على تيار متدفق (مثل hadoop fs -cat /myfile.csv) فإنه سوف يقرأ فقط وحدات بايت حجم shm من الأنبوب إلى mmap. لا يبلغ عن خطأ عبر واجهة C التي أظن أنه أمر طبيعي. ومع ذلك ، فإن تصحيح سبب شكوى fread بشأن تنسيق الملف أدى إلى الغوص العميق في الكود R و C لجدول البيانات لاكتشاف أنه يستخدم هذه الآلية. تم الإبلاغ عن الخطأ (رسالة عشوائية بناءً على مكان قطع الأنبوب الخاص بي):

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

يمكن إعادة إنتاج ذلك عن طريق القيام بما يلي:

  • أنشئ ملفًا حجمه حوالي 5 ميغا بايت أكبر من / dev / shm
  • اضبط / dev / shm على شيء مثل 64M (هذا هو الإعداد الافتراضي لحاوية Docker)
  • تشغيل fread على "cat ~ / myfile.csv" <- تنشئ cat الأنبوب
  • Docker V1.12 +
  • أحدث صورة Centos من Docker hub
  • R-open v3.4.0 (مايكروسوفت)

في الكود: https://github.com/Rdatatable/data.table/blob/master/src/fread.c
حول السطر 788 ربما يجب أن يتحقق من حجم / dev / shm لمعرفة ما إذا كان يطابق الملف الذي قرأه للتو في الذاكرة. في حالتي في عامل الإرساء ، يوجد هنا الإخراج المطول لحالة الاختبار الفاشلة:

 > 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

نتائج متوقعة:

 File opened, filesize is 0.373524 GB.

بالإضافة إلى ذلك ، عندما يفشل ، يعرف داخليًا السطر # والمعلومات المفيدة الأخرى عندما يفشل. اضطررت إلى التركيز على القيمة يدويًا قبل أن أكتشف العلم المطول. سيكون لطيفًا إذا أشارت رسائل الخطأ العادية إلى الصف #. يُظهر vebose = T الموقع عندما يحسب عدد المحددات مثل حالة الاختبار هذه سيكون ناتجًا مفيدًا عن الخطأ (نظرًا لأنني كنت أعرف أن الملف يحتوي على سجلات 20 مليونًا):

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

التعليق الأكثر فائدة

يا رفاق ، أنا من أبلغ عن zUMIS / 19 . لقد جربت ديف 1.10.5 وهو يعمل بشكل مثالي. رفاق العمل العظيم!

ال 3 كومينتر

بالنسبة لأي شخص يجد نفس المشكلة ، فإن الإصلاح قصير المدى هو زيادة حجم الذاكرة المشتركة للحاوية أو في نظام التشغيل الخاص بك إذا كان / dev / shm صغيرًا جدًا. تستخدم أنظمة التشغيل الحديثة النموذجية 50٪ من الذاكرة المتوفرة لديك. في مثيل 64G amazon ec2 الخاص بي ، قمت بتعيين حاوية عامل الإرساء لاستخدام:

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

متفق. اسف بشأن ذلك.
التغيير الأخير في التطوير هو هذا من الأخبار:

لم يعد يتم استخدام قرص ذاكرة الوصول العشوائي (/ dev / shm) لإخراج إدخال أوامر النظام. على الرغم من أنه كان أسرع عندما يعمل ، إلا أنه تسبب في الكثير من أخطاء الجهاز الكاملة ؛ على سبيل المثال ، # 1139 و zUMIs / 19. بفضل كايل تشونغ للإبلاغ. يتم الآن استخدام معيار tempdir (). إذا كنت ترغب في استخدام قرص ذاكرة الوصول العشوائي ، فاضبط TEMPDIR على / dev / shm ؛ انظر؟ tempdir.

يرجى تجربة dev 1.10.5 وفتح مشكلة جديدة إذا كانت لا تزال تمثل مشكلة.

يا رفاق ، أنا من أبلغ عن zUMIS / 19 . لقد جربت ديف 1.10.5 وهو يعمل بشكل مثالي. رفاق العمل العظيم!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات