سؤال

تحياتي، أحصل على عدد كبير من السجلات من قاعدة البيانات والكتابة في ملف. كان يتساءل عن أفضل طريقة لكتابة ملفات ضخمة. (1 جيجابايت - 10 جيجابايت).

حاليا أنا أستخدم الكاتب المؤقت

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
 //do writings
}
mbrWriter.close();
هل كانت مفيدة؟

المحلول

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

وهكذا، على سبيل المثال

while (resultSet.next()) {
    writer.write(resultSet.getString("columnname"));
    // ...
}

ومع ذلك، فإن معظم سفن DB لائقة مع إمكانات الصادرات إلى CSV المدمجة والتي تعد وسيلة غير فعالة أكثر فعالية مما كنت تستطيع القيام به في جافا. لم تذكر أي واحد تستخدمه، ولكن إذا كان على سبيل المثال mysql، فيمكنك استخدام LOAD DATA INFILE لهذا. ما عليك سوى إحالة الوثائق الخاصة ب DB. آمل أن يعطي هذا رؤى جديدة.

نصائح أخرى

حجم المخزن المؤقت الافتراضي للكاتب المخزن المؤقت هو 8192. إذا كنت ستكون تكتب ملفات Squigabyte، فقد ترغب في زيادة ذلك باستخدام منشئ 2 وسيطة؛ على سبيل المثال

int buffSize = ... // 1 megabyte or so
BufferedWriter mbrWriter = new BufferedWriter(new FileWriter(memberCSV), buffSize);

هذا يجب أن يقلل من عدد syscalls اللازمة لكتابة الملف.

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

أنا لست متأكدا 100٪، ولكن يبدو أن tha bufferedreader يحمل البيانات في مخزن مؤقت في ذاكرة الوصول العشوائي. يمكن ل Java استخدام ذاكرة الوصول العشوائي 128 ميجابايت (ما لم ينص على خلاف ذلك)، وبالتالي فمن المحتمل أن يتأرجح المخزن المؤقت لذاكرة Java التي تسبب خطأ. حاول استخدام InputStreamReader و FileINPuttream لقراءة البيانات ثم تخزينها في Char، ثم اكتب فقط هذا السحر باستخدام ملفات fileOutstream.

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