سؤال

لدي ملف من حجم 2GB التي لديها سجلات الطلاب في ذلك.كنت بحاجة إلى العثور على الطلاب بناء على سمات معينة في كل سجل و إنشاء ملف جديد مع النتائج.من أجل تصفية الطلاب يجب أن يكون نفسه كما في الملف الأصلي.ما هي كفاءة وأسرع طريقة للقيام بذلك باستخدام جافا IO API و المواضيع دون وجود ذاكرة القضايا ؟ على maxheap حجم JVM هو 512MB.

هل كانت مفيدة؟

المحلول

  1. 2 جيجابايت لملف ضخم ، يجب أن تذهب للحصول على ديسيبل.
  2. إذا كنت تريد حقًا استخدامها Java I/O API, ، ثم جرب هذا: التعامل مع ملفات البيانات الكبيرة بكفاءة مع Java وهذا: ضبط أداء Java I/O

نصائح أخرى

أي نوع من الملفات؟ نصية ، مثل CSV؟

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

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

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

لن يزيد من تعقيد هذا حتى تجد أنه ممل طريقة بسيطة لا يعمل على ما تحتاجه.أساسا كنت فقط بحاجة الى:

  • فتح تيار الإدخال إلى 2GB الملف ، وتذكر أن العازلة (مثلمن خلال التفاف مع BufferedInputStream)
  • فتح تيار الإخراج إلى تصفية ملف كنت تنوي إنشاء
  • قراءة السجل الأول من دفق الإدخال ، أنظر مهما كانت السمة أن تقرر ما إذا كنت "الحاجة" ؛ إذا كنت تفعل, الكتابة إلى ملف الإخراج
  • كرر المتبقية السجلات

على واحدة من بلدي اختبار أنظمة متواضعة للغاية الأجهزة ، BufferedInputStream حول فيلينبوتستريام في الخروج من مربع قراءة حوالي 500 MB في 25 ثانية ، أيربما أقل من 2 دقيقة إلى عملية 2GB الملف و حجم المخزن المؤقت الافتراضي هو في الأساس جيدة كما يحصل (انظر BufferedInputStream الأوقات أنا جعلت لمزيد من التفاصيل).أتصور بأحدث الأجهزة فمن الممكن جدا يكون الوقت إلى النصف.

إذا كنت بحاجة للذهاب إلى الكثير من الجهد للحد من 2/3 دقيقة أو مجرد الذهاب الاولى في حين كنت في انتظار ذلك إلى تشغيل هو القرار الذي سيكون لديك لجعل اعتمادا على الاحتياجات الخاصة بك.أعتقد أن الخيار قاعدة البيانات لن تشتري الكثير إلا إذا كنت في حاجة إلى القيام بالكثير من معالجة مختلفة يعمل على نفس مجموعة البيانات (وهناك حلول أخرى هذا لا يعني تلقائيا قاعدة بيانات).

أعتقد أنك يجب أن تستخدم تم تعيين الذاكرة الملفات. سيساعدك هذا على تعيين الملف الأكبر لذاكرة أصغر. وسيعمل هذا مثل الذاكرة الافتراضية وبقدر ما يتعلق الأمر بالملفات المعينة هي أسرع من الدفق/القراءة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top