>  기사  >  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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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