Rumah > Java > javaTutorial > Bagaimanakah Saya Boleh Mengoptimumkan Kelajuan Menulis Apabila Menulis Data Besar ke Fail Teks di Java?

Bagaimanakah Saya Boleh Mengoptimumkan Kelajuan Menulis Apabila Menulis Data Besar ke Fail Teks di Java?

Linda Hamilton
Lepaskan: 2024-11-27 10:00:14
asal
327 orang telah melayarinya

How Can I Optimize Writing Speed When Writing Massive Data to Text Files in Java?

Menyiasat Kelajuan Optimum untuk Menulis Data Besar ke Fail Teks di Java

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.

The Bottleneck with BufferedWriter

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.

Melucuti BufferedWriter

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.

Pengukuran Prestasi

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.

Mengasingkan Overhed

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.

Pelaksanaan Alternatif

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan