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