2017-05-02 5 views
0

에서 파일에서 몇 줄을 읽어 : 파일이 먼 서버에있는 경우다음 코드는 잘 작동 한 번

Function ReadLines(FN As String, n As Integer) As String() 
    Dim T(0 To n) As String 
    With My.Computer.FileSystem.OpenTextFileReader(FN) 
     For i As Integer = 0 To n 
      T(i) = .ReadLine() 
     Next 
    End With 
    Return T 
End Function 

그러나,이 엄청나게 느린 증명할 수 있습니다. 동일한 작업을보다 효율적으로 수행 할 수있는 방법이 있습니까? 한 번의 작업으로 전체 파일을 읽지 않습니다 ... File.ReadAllLines 방법과 달리

답변

1

BufferedStream class은 파일을 시리즈로 순차적으로 읽거나 쓸 때 시스템 IO 수를 줄이기 위해 특별히 설계되었습니다. 그래서이가 할 것으로 예상된다 당신의 더 효과적인 읽습니다.

Function ReadLines(FN As String, n As Integer) As String() 
    Using fs As FileStream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 
     Using bs As New BufferedStream(fs) 
      Using sr As New StreamReader(bs) 
       Dim lines = New List(Of String)(n) 
       For i As Integer = 0 To n 
        Dim line As String = sr.ReadLine() 
        If (line Is Nothing) Then 
         Exit For 
        End If 
        lines.Add(line) 
       Next 
       Return lines.ToArray() 
      End Using 
     End Using 
    End Using 
End Function 
+0

아직 효율성을 테스트하지 않았지만 fs.close를 추가해야합니다. 그렇지 않으면 파일이 잠길 것입니다. – Pierre

+0

'Close()'가'Dispose()'에 의해 호출 될 것으로 믿습니다. 이것은' End Using' –

+0

글쎄 그것은 그렇게 보이지 않는다. 적어도 내 컴파일러에서는 그렇지 않다. – Pierre

0
Dim lines = IO.File.ReadLines(fileName). 
        Skip(firstLineIndex). 
        Take(lineCount). 
        ToArray() 

, File.ReadLines를 내가 한 번도에 전체 파일을 읽을 수 있지만,이 또한 매우 비효율적이다. 파일의 내용을 Enumerable(Of String)으로 표시하지만 사용하기 전까지는 파일에서 아무 것도 읽지 않습니다. 이 코드는 원하는 모든 행을 읽어야하지만 그 이상의 내용은 읽지 않습니다.

실제적으로 후드 아래 StreamReader.ReadLine을 사용할 수 있기 때문에 정직하게 말하면 얼마나 빨라질 지 확신 할 수 없습니다. 그것은 시험 가치가있어. 대안은 파일의 큰 덩어리를 읽은 다음 줄을 긋고 적어도 필요한만큼 읽었을 때 멈추는 것입니다.

+0

는'FileSystem.OpenTextFileReader'는'StreamReader' 반환, 그래서'File.ReadLines (...)를 생각 (N)를 가지고'효율적이다 OP 코드 스 니펫에서와 같이'.ReadLine()''N '번 호출하는 것과 같습니다. 따라서'File.ReadLines (...). Take (N)'은 성능에 아무 것도 추가하지 않습니다. 비록 당신의 코드가 확실히 더 간결하고 아름답습니다. –

+0

내 환경에서는 ("take"는 인식되지 않습니다.) 컴파일되지 않지만, @DmitryEgorov가 옳다면 어쨌든 유용하지 않습니다. 큰 덩어리를 읽는 것에 대해서는 실제로 사용 가능합니다. 특정 수의 문자를 읽으려면 어떻게해야합니까? – Pierre