Java で大きなデータをテキスト ファイルに書き込む最速の方法は「BufferedWriter」ですか?

Susan Sarandon
リリース: 2024-11-09 19:12:02
オリジナル
772 人が閲覧しました

Is `BufferedWriter` the Fastest Way to Write Large Data to a Text File in Java?

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

概要:

書き込み大量のデータをテキスト ファイルに保存することは、さまざまなプログラミング シナリオにおいて重要なタスクとなる可能性があります。 Java では、この目的のために BufferedWriter クラスが一般的に使用されます。ただし、特に大規模なデータセットを扱う場合は、操作の効率を考慮することが重要です。

質問:

BufferedWriter は、大規模なデータを書き込むのに最適な速度を提供できますか?テキストファイル? Java はより効率的な代替手段を提供できますか?

応答:

BufferedWriter はファイル書き込みに広く使用されている方法ですが、非常に大規模なデータに対して常に最速のソリューションであるとは限りません。 。パフォーマンスを最適化するには、BufferedWriter をバイパスして FileWriter を直接使用すると有益な場合があります。最近のシステムではデータをキャッシュ メモリに保存することが多く、BufferedWriter のバッファリング メカニズムが冗長になっています。

結果:

実証テストにより、FileWriter を直接使用すると書き込み速度が大幅に向上することが実証されました。 FileWriter を使用した 175MB のデータ (400 万文字列) の書き込みを伴うベンチマーク テストでは、BufferedWriter を使用した場合よりも大幅に高速な 4 ~ 5 秒の時間を達成しました。

追加の考慮事項:

レコードの取得とファイルの書き込みの時間コンポーネントを分離すると、プロセス全体の効率について貴重な洞察が得られます。

コード例:

次のコードスニペットは、生データの書き込みと、さまざまなバッファ サイズの BufferedWriters を使用した書き込みを比較するパフォーマンス テストを示しています:

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<>(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() should take care of this
        writer.close();
        long end = System.currentTimeMillis();
        System.out.println((end - start) / 1000f + " seconds");
    }
}
ログイン後にコピー

以上がJava で大きなデータをテキスト ファイルに書き込む最速の方法は「BufferedWriter」ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート