0

Twitter apiデータを使用しており、ストリームの結果をテキストファイルに保存した後、データをパーサーアプリケーションに入力します。私が計画したのは大きなデータファイルだったので、エラーの可能性を回避するために個々の投稿を区切るために区切り文字]}を使用してコンテンツを読みましたか?バックアップ機能は、バッファを使用してデータを読み取り、個々の投稿に切り込むことでした。ただし、問題は、単一の投稿の場合、メモリ例外が発生することです。個々の投稿を見ると、必ずしも大きくは見えませんが、テキストには外国の文字やエンコードが含まれているため、メモリの例外が発生していると思います。正確にこれであるかどうかはまだわかりませんが、ここからいくつかの入力やアドバイスを得ると思いました...

        myreader.TextFieldType = FileIO.FieldType.Delimited
        myreader.SetDelimiters("]}}")
        Dim currentRow As String()

        Try

            While Not myreader.EndOfData
                Try
                    currentRow = myreader.ReadFields()
                    Dim currentField As String

                    For Each currentField In currentRow
                        data = data + currentField
                        counter += 1
                        If counter = 1000 Then
                            Dim pt As New parsingUtilities
                            If Not data = "" Then
                                pt.getNodes(data)
                                counter = 0
                            End If
                        End If
                    Next
                Catch ex As Exception
                    If ex.Message.Contains("MemoryException") Then
                        fileBKup()
                    End If
                End Try

もう1つメモリ例外が発生したときは、別の投稿に分割しようとします。

    Dim sampleResults() As String
    Dim stringSplitter() As String = {"}}"}

    ' split the file content based on the closing entry tag
    sampleResults = Nothing
    Try
        sampleResults = post.Split(stringSplitter, StringSplitOptions.RemoveEmptyEntries)

    Catch ex As Exception
        appLogs.constructLog(ex.Message.ToString, True, True)
        moveErrorFiles(form1.infile)
        Exit Sub
    End Try
4

1 に答える 1

1

問題は文字列だと思います。

文字列は不変です。つまり、これを行うことで文字列を変更していると思うたびに

data = data + currentField  

実際には、メモリ内に別の新しい文字列を作成しています。したがって、それを何千回も実行すると、それらがマウントされてOutOfMemoryExceptionが発生するため、問題が発生する可能性があります。

文字列を作成する場合は、代わりにStringBuilderを使用する必要があります。

于 2012-05-15T15:56:39.997 に答える