ホームページ  >  記事  >  Java  >  Java で大量のデータをテキスト ファイルに書き込むときに書き込み速度を最適化するにはどうすればよいですか?

Java で大量のデータをテキスト ファイルに書き込むときに書き込み速度を最適化するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-27 10:00:14276ブラウズ

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

Java で大量のデータをテキスト ファイルに書き込むための最適速度の調査

大量のデータをテキスト ファイルに書き込むのは時間のかかる作業ですが、最適な速度を実現するには重要です。この記事では、テキスト ファイル形式を使用して Java で大量のデータを書き込む最速の手法について説明します。

BufferedWriter のボトルネック

BufferedWriter を使用してテキスト ファイルにデータを書き込む場合、デフォルトのバッファサイズを大きくするとパフォーマンスが低下する可能性があります。これは、BufferedWriter が内部バッファを基礎となるファイル ストリームに定期的にフラッシュし、追加のオーバーヘッドが発生するためです。

BufferedWriter の除去

書き込み速度を最適化するには、BufferedWriter を削除し、FileWriter を直接使用することを検討してください。このアプローチにより、バッファ フラッシュのオーバーヘッドが排除され、システムがディスクのキャッシュ メモリに直接書き込みを実行できるようになります。

パフォーマンス測定

経験的に、BufferedWriter を削除すると書き込み速度が大幅に向上します。 400 万文字列 (175MB) を使用して実施されたテストでは、最新のシステムでは書き込み時間が 40 秒から約 4 ~ 5 秒に短縮されたことがわかりました。

オーバーヘッドの分離

書き込みプロセスでは、レコードの取得に費やされる時間をファイルの書き込みに費やされる時間から分離することが重要です。タスクごとに個別のテストを実行することで、パフォーマンスを改善できる領域を特定できます。

代替実装

次の Java コードは、直接ファイル書き込みとバッファー ファイル書き込みの両方を使用した代替実装を提供します。異なるバッファ サイズ間の比較を可能にします:

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

この実装では、ファイルへの直接書き込みを使用することによる速度の利点が明らかになり、バッファ サイズの影響についての洞察が得られます。書き込みパフォーマンスに応じてバッファ サイズが変化します。

Java では、ファイル書き込みプロセスを最適化し、不要なオーバーヘッドを削除することにより、大量のデータを効率的にテキスト ファイルに書き込むことができます。ファイルを直接書き込むか、大きなバッファ サイズで BufferedWriter を使用すると、書き込み速度が大幅に向上し、大規模なデータ セットでも驚くべき速度で処理できるようになります。

以上がJava で大量のデータをテキスト ファイルに書き込むときに書き込み速度を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。