파일을 한 줄씩 읽는 가장 빠른 방법을 찾으려면 벤치마킹을 수행해야합니다. 컴퓨터에서 몇 가지 작은 테스트를 수행했지만 결과가 환경에 적용되는 것을 기대할 수 없습니다.
StreamReader.ReadLine 사용
이것은 기본적으로 당신의 방법입니다. 어떤 이유로 버퍼 크기를 가능한 가장 작은 값 (128)으로 설정했습니다. 이를 늘리면 일반적으로 성능이 향상됩니다. 기본 크기는 1,024이고 다른 좋은 선택은 512 (Windows의 섹터 크기) 또는 4,096 (NTFS의 클러스터 크기)입니다. 최적의 버퍼 크기를 결정하려면 벤치 마크를 실행해야합니다. 더 큰 버퍼는 더 빠르지는 않지만 적어도 작은 버퍼보다 느리지 않습니다.
const Int32 BufferSize = 128;
using (var fileStream = File.OpenRead(fileName))
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) {
String line;
while ((line = streamReader.ReadLine()) != null)
// Process line
}
FileStream
생성자를 지정할 수 있습니다 FileOptions을 . 예를 들어, 큰 파일을 처음부터 끝까지 순차적으로 읽는 경우 이점이있을 수 있습니다 FileOptions.SequentialScan
. 다시 한 번 벤치마킹이 최선의 방법입니다.
File.ReadLines 사용
이것은 StreamReader
고정 버퍼 크기 1,024를 사용하여 구현된다는 점을 제외하고는 자체 솔루션과 매우 유사합니다 . 내 컴퓨터에서는 버퍼 크기가 128 인 코드와 비교하여 약간 더 나은 성능을 제공합니다. 그러나 더 큰 버퍼 크기를 사용하면 동일한 성능 향상을 얻을 수 있습니다. 이 방법은 반복자 블록을 사용하여 구현되며 모든 라인에 메모리를 사용하지는 않습니다.
var lines = File.ReadLines(fileName);
foreach (var line in lines)
// Process line
File.ReadAllLines 사용
이 방법은 반환 된 행 배열을 만드는 데 사용되는 문자열 목록을 늘려 메모리 요구 사항이 더 높다는 점을 제외하면 이전 방법과 매우 유사합니다. 그러나 임의로 리턴 하여 회선에 액세스 할 수 는 String[]
없습니다 IEnumerable<String>
.
var lines = File.ReadAllLines(fileName);
for (var i = 0; i < lines.Length; i += 1) {
var line = lines[i];
// Process line
}
String.Split 사용
이 방법은 아마도 String.Split
구현 방법으로 인해 적어도 큰 파일 (511KB 파일에서 테스트 됨)에서 상당히 느립니다 . 또한 솔루션에 비해 필요한 메모리를 늘리는 모든 라인에 배열을 할당합니다.
using (var streamReader = File.OpenText(fileName)) {
var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
// Process line
}
File.ReadLines
깨끗하고 효율적이기 때문에 사용 하는 것이 좋습니다. 특별한 공유 옵션이 필요한 경우 (예 FileShare.ReadWrite
:) 자체 코드를 사용할 수 있지만 버퍼 크기를 늘려야합니다.
Fastest
하면 성능이나 개발 관점에서 의미?