>  기사  >  Java  >  `BufferedWriter`는 Java에서 텍스트 파일에 대용량 데이터를 쓰는 가장 빠른 방법입니까?

`BufferedWriter`는 Java에서 텍스트 파일에 대용량 데이터를 쓰는 가장 빠른 방법입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-09 19:12:02775검색

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만 문자열)를 쓰는 벤치마크 테스트는 4-5초의 시간 범위를 달성했는데, 이는 BufferedWriter를 사용할 때보다 훨씬 빠릅니다.

추가 고려 사항:

기록 검색 및 파일 작성을 위한 시간 구성 요소를 분리하면 전체 프로세스의 효율성에 대한 귀중한 통찰력을 얻을 수 있습니다.

예제 코드:

다음 코드 스니펫은 원시 데이터 쓰기와 다양한 버퍼 크기의 BufferedWriter를 사용한 쓰기를 비교하는 성능 테스트를 보여줍니다.

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");
    }
}

위 내용은 `BufferedWriter`는 Java에서 텍스트 파일에 대용량 데이터를 쓰는 가장 빠른 방법입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.