Menulis data yang luas ke fail teks boleh menjadi tugas yang memakan masa dan mencapai kelajuan optimum adalah penting. Artikel ini meneroka teknik terpantas untuk menulis sejumlah besar data dalam Java menggunakan format fail teks.
Apabila menggunakan BufferedWriter untuk menulis data pada fail teks, penimbal lalai saiz boleh menyebabkan prestasi yang lebih perlahan. Ini kerana BufferedWriter secara berkala membuang penimbal dalaman ke aliran fail asas, memperkenalkan overhed tambahan.
Untuk mengoptimumkan kelajuan penulisan, pertimbangkan untuk menghapuskan BufferedWriter dan terus menggunakan FileWriter. Pendekatan ini menghilangkan overhed pembilasan penimbal dan membolehkan sistem melakukan penulisan terus ke memori cache cakera.
Secara empirik, mengalih keluar BufferedWriter meningkatkan kelajuan tulis dengan ketara. Ujian yang dijalankan menggunakan 4 juta rentetan (175MB) menunjukkan pengurangan masa penulisan daripada 40 saat kepada sekitar 4-5 saat pada sistem moden.
Untuk mengenal pasti kesesakan dalam proses penulisan, adalah penting untuk memisahkan masa yang digunakan untuk mendapatkan semula rekod daripada masa yang digunakan untuk menulis fail. Dengan menjalankan ujian berasingan untuk setiap tugas, anda boleh menentukan kawasan di mana peningkatan prestasi boleh dibuat.
Kod Java berikut menyediakan pelaksanaan alternatif menggunakan kedua-dua penulisan fail langsung dan timbalan, membenarkan perbandingan antara saiz penimbal yang berbeza:
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.List; public class FileWritingPerfTest { private static final int ITERATIONS = 5; private static final double MEG = (Math.pow(1024, 2)); private static final int RECORD_COUNT = 4000000; private static final String RECORD = "Help I am trapped in a fortune cookie factory\n"; private static final int RECSIZE = RECORD.getBytes().length; public static void main(String[] args) throws Exception { List<String> records = new ArrayList<String>(RECORD_COUNT); int size = 0; for (int i = 0; i < RECORD_COUNT; i++) { records.add(RECORD); size += RECSIZE; } System.out.println(records.size() + " 'records'"); System.out.println(size / MEG + " MB"); for (int i = 0; i < ITERATIONS; i++) { System.out.println("\nIteration " + i); writeRaw(records); writeBuffered(records, 8192); writeBuffered(records, (int) MEG); writeBuffered(records, 4 * (int) MEG); } } private static void writeRaw(List<String> records) throws IOException { File file = File.createTempFile("foo", ".txt"); try { FileWriter writer = new FileWriter(file); System.out.print("Writing raw... "); write(records, writer); } finally { // comment this out if you want to inspect the files afterward file.delete(); } } private static void writeBuffered(List<String> records, int bufSize) throws IOException { File file = File.createTempFile("foo", ".txt"); try { FileWriter writer = new FileWriter(file); BufferedWriter bufferedWriter = new BufferedWriter(writer, bufSize); System.out.print("Writing buffered (buffer size: " + bufSize + ")... "); write(records, bufferedWriter); } finally { // comment this out if you want to inspect the files afterward file.delete(); } } private static void write(List<String> records, Writer writer) throws IOException { long start = System.currentTimeMillis(); for (String record: records) { writer.write(record); } // writer.flush(); // close() sh
Pelaksanaan ini mendedahkan faedah kelajuan menggunakan penulisan fail langsung dan memberikan pandangan tentang pengaruh saiz penimbal yang berbeza-beza pada prestasi penulisan.
Dengan mengoptimumkan proses penulisan fail dan mengalih keluar overhed yang tidak perlu, Java membolehkan anda menulis data yang luas ke fail teks dengan cekap. Penulisan fail terus atau menggunakan BufferedWriter dengan saiz penimbal yang besar boleh meningkatkan kelajuan tulis dengan ketara, membolehkan anda mengendalikan set data yang besar sekalipun dengan kelajuan yang luar biasa.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan Kelajuan Menulis Apabila Menulis Data Besar ke Fail Teks di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!