إذا كانت البيانات لا تنسجم مع الذاكرة. أبسط الطرق


Aardvark أنثى مع شبل. الصورة: سكوتو بير ، CC BY-SA 2.0

تكتب برنامجًا لمعالجة البيانات ، فهو يجتاز الاختبار تمامًا على ملف صغير ، لكنه يتعطل عند تحميل حقيقي.

المشكلة هي نفاد الذاكرة. إذا كان لديك 16 غيغابايت من ذاكرة الوصول العشوائي ، فلن تكون قادرًا على تنزيل مئات الملفات غيغابايت هناك. في مرحلة ما ، سوف ينفد نظام التشغيل من الذاكرة ، ولن يكون قادرًا على تخصيص نظام جديد ، وسوف يتعطل البرنامج.

ما يجب القيام به

حسنًا ، يمكنك نشر مجموعة بيانات كبيرة ، فقط:

  • العثور على مجموعة من أجهزة الكمبيوتر.
  • إعداده في أسبوع.
  • تعلم واجهة برمجة التطبيقات الجديدة وأعد كتابة التعليمات البرمجية الخاصة بك.

أنها مكلفة وغير سارة. لحسن الحظ ، فإنه في كثير من الأحيان ليس من الضروري.

نحتاج إلى حل بسيط وسهل: معالجة البيانات على كمبيوتر واحد ، مع الحد الأدنى من الإعداد والاستخدام الأقصى للمكتبات المتصلة بالفعل. يكون هذا ممكنًا دائمًا تقريبًا بمساعدة أبسط الطرق ، التي تسمى أحيانًا الحساب خارج النواة.

في هذه المقالة نناقش:

  • لماذا نحتاج RAM على الإطلاق.
  • أسهل طريقة لمعالجة البيانات التي لا تناسب الذاكرة هي إنفاق القليل من المال.
  • ثلاث طرق برمجية رئيسية لمعالجة كميات كبيرة من البيانات: الضغط والحظر والفهرسة.

ستُظهر المقالات المستقبلية في الممارسة العملية كيفية تطبيق هذه الأساليب مع مكتبات محددة مثل NumPy و Pandas. لكن أولاً ، النظرية.

لماذا RAM ضروري على الإطلاق؟


قبل أن ندخل في مناقشة الحلول ، دعونا نوضح سبب وجود هذه المشكلة على الإطلاق. يمكنك كتابة البيانات على ذاكرة الوصول العشوائي (RAM) ، وأيضًا إلى محرك الأقراص الثابتة لديك ، فلماذا تحتاج RAM؟ القرص أرخص ، وعادة ما لا يواجه أي مشكلة مع عدم وجود مساحة ، فلماذا لا تقتصر فقط على القراءة والكتابة من القرص؟

نظريا ، هذا قد ينجح. ولكن حتى محركات أقراص الحالة الصلبة السريعة الحديثة تعمل بشكل أبطأ بكثير من ذاكرة الوصول العشوائي:

  • قراءة من SSD: ~ 16000 نانو ثانية
  • قراءة من ذاكرة الوصول العشوائي: ~ 100 نانو ثانية

بالنسبة للحسابات السريعة ، ليس لدينا خيار: يجب كتابة البيانات على ذاكرة الوصول العشوائي ، وإلا فإن الرمز سيتباطأ 150 مرة.

الحل الأسهل: المزيد من ذاكرة الوصول العشوائي


أسهل حل لمشكلة نفاد ذاكرة الوصول العشوائي هو إنفاق بعض المال. يمكنك شراء كمبيوتر قوي أو خادم أو استئجار جهاز افتراضي به الكثير من الذاكرة. في نوفمبر 2019 ، يوفر البحث السريع ومقارنة الأسعار المختصرة للغاية الخيارات التالية:

  • اشترِ Thinkpad M720 Tower بـ 6 مراكز و 64 جيجابايت من ذاكرة الوصول العشوائي مقابل 1074 دولارًا
  • استئجار آلة افتراضية في السحابة مع 64 النوى و 432 غيغابايت من ذاكرة الوصول العشوائي مقابل 3.62 دولار في الساعة

هذه مجرد أرقام بعد البحث السريع. بعد إجراء بحث جيد ، ستجد بالتأكيد أفضل الصفقات.

غالبًا ما يكون إنفاق القليل من المال على الأجهزة لتناسب البيانات في ذاكرة الوصول العشوائي. بعد كل شيء ، عصرنا مكلف. لكن في بعض الأحيان هذا لا يكفي.

على سبيل المثال ، إذا كنت تقوم بالعديد من مهام معالجة البيانات على مدار فترة من الزمن ، فقد تكون الحوسبة السحابية حلاً طبيعيًا ، ولكنها قد تكون مكلفة أيضًا. في أحد مشاريعنا ، كانت تكاليف الحوسبة هذه تستهلك جميع الإيرادات المتوقعة من المنتج ، بما في ذلك أهم الدخل المطلوب لدفع راتبي.

إذا كان شراء / استئجار كمية كبيرة من ذاكرة الوصول العشوائي لا يحل المشكلة أو كان غير ممكن ، فإن الخطوة التالية هي تحسين التطبيق نفسه بحيث يستهلك ذاكرة أقل.

تقنية رقم 1. ضغط


يسمح لك الضغط بوضع نفس البيانات في ذاكرة أقل. هناك نوعان من الضغط:

  • ضياع : بعد الضغط ، يتم حفظ نفس المعلومات بالضبط كما هو الحال في البيانات الأصلية.
  • ضياع : البيانات المخزنة تفقد بعض التفاصيل ، لكن من الناحية المثالية هذا لا يؤثر بشكل كبير على نتائج الحساب.

فقط من أجل الوضوح ، لا يتعلق الأمر بملفات zip أو gzip عند ضغط البيانات على القرص . لمعالجة البيانات من ملف ZIP ، تحتاج عادةً إلى فك ضغطها ، ثم تحميل الملفات في الذاكرة. لذلك هذا لن يساعد.

ما نحتاج إليه هو ضغط تمثيل البيانات في الذاكرة .

افترض أن مخازن البيانات الخاصة بك اثنين فقط من القيم الممكنة ، ولا شيء آخر: "AVAILABLE" و "AVAILABLE" "UNAVAILABLE" . بدلاً من تخزين السلاسل ذات 10 بايتات أو أكثر لكل سجل ، يمكنك حفظها كقيم منطقية True أو False ، والتي يتم ترميزها باستخدام بايت واحد فقط. يمكنك ضغط المعلومات حتى ولو واحد ، مما يقلل من استهلاك الذاكرة بمقدار ثماني مرات أخرى.

تقنية رقم 2. تقسيم إلى كتل ، تحميل البيانات كتلة واحدة في وقت واحد


التفتت مفيد في المواقف التي لا يلزم فيها تحميل البيانات في الذاكرة في نفس الوقت. بدلاً من ذلك ، يمكننا تحميلها في أجزاء ، ومعالجة جزء واحد في وقت واحد (أو ، كما نناقش في المقالة التالية ، عدة أجزاء بالتوازي).

افترض أنك تريد العثور على أكبر كلمة في كتاب. يمكنك تحميل جميع البيانات في الذاكرة مرة واحدة:

 largest_word = "" for word in book.get_text().split(): if len(word) > len(largest_word): largest_word = word 

ولكن إذا كان الكتاب لا يتلاءم مع الذاكرة ، فيمكنك تحميله صفحة تلو الأخرى:

 largest_word = "" for page in book.iterpages(): for word in page.get_text().split(): if len(word) > len(largest_word): largest_word = word 

هذا يقلل بشكل كبير من استهلاك الذاكرة لأنه يتم تحميل صفحة واحدة فقط من الكتاب في وقت واحد. في هذه الحالة ، ستكون النتيجة هي نفس الإجابة.

تقنية رقم 3. الفهرسة عند طلب مجموعة فرعية فقط من البيانات


الفهرسة مفيدة إذا كنت ترغب في استخدام مجموعة فرعية فقط من البيانات وستقوم بتحميل مجموعات فرعية مختلفة في أوقات مختلفة.

من حيث المبدأ ، في مثل هذه الحالة ، يمكنك تصفية الجزء الضروري والتخلص من غير الضروري. لكن التصفية بطيئة وليست مثالية ، لأنه يجب عليك أولاً تحميل الكثير من البيانات الإضافية في الذاكرة قبل إسقاطها.

إذا كنت تحتاج فقط إلى جزء من البيانات ، بدلاً من التجزئة ، فمن الأفضل استخدام فهرس - ضغط بيانات يشير إلى موقعها الحقيقي.

تخيل أنك تريد قراءة أجزاء فقط من كتاب يذكر aardvark (حيوان ثديي لطيف في الصورة في بداية المقال). إذا قمت بالتحقق من كل الصفحات بدورها ، فسيتم تحميل الكتاب بالكامل في أجزاء ، صفحة تلو الأخرى ، بحثًا عن علامات أرضية - وهذا سيستغرق بعض الوقت.

أو يمكنك على الفور فتح الفهرس الأبجدي في نهاية الكتاب - والعثور على كلمة "aardvark". ينص على أن الكلمة مذكورة في الصفحات 7 و 19 و 120-123. يمكنك الآن قراءة هذه الصفحات ، وفقط هذه الصفحات ، وهي أسرع بكثير.

هذه طريقة فعالة لأن الفهرس أصغر بكثير من الكتاب بأكمله ، لذلك من الأسهل بكثير تحميل الفهرس فقط في الذاكرة للعثور على البيانات ذات الصلة.

أسهل طريقة الفهرسة


الطريقة الأسهل والأكثر شيوعًا للفهرسة هي تسمية الملفات في الدليل:

 mydata/ 2019-Jan.csv 2019-Feb.csv 2019-Mar.csv 2019-Apr.csv ... 

إذا كنت بحاجة إلى بيانات لشهر مارس 2019 ، فكل ما عليك هو تحميل الملف 2019-Mar.csv - ليست هناك حاجة لتنزيل البيانات لشهر فبراير أو يوليو أو أي شهر آخر.

التالي: تطبيق هذه الأساليب


من السهل حل مشكلة نقص ذاكرة الوصول العشوائي (RAM) بمساعدة النقود ، بعد شراء ذاكرة الوصول العشوائي (RAM). ولكن إذا لم يكن ذلك ممكنًا أو غير كافٍ ، فستستخدم الضغط أو التجزئة أو الفهرسة على أي حال.

يتم استخدام نفس الأساليب في حزم البرامج والأدوات المختلفة . حتى أنظمة البيانات الكبيرة عالية الأداء مبنية عليها: على سبيل المثال ، المعالجة المتوازية لشظايا البيانات الفردية.

في المقالات التالية ، سننظر في كيفية تطبيق هذه الأساليب في مكتبات وأدوات معينة ، بما في ذلك NumPy و Pandas.

Source: https://habr.com/ru/post/ar479282/


All Articles