4

C# プロジェクトで CSVHelper を使用しており、大きな csv データ ファイル (約 2000 レコード) をメモリに読み込んでいます。

https://github.com/JoshClose/CsvHelper

レコードが 500 未満の場合は問題なく動作します。ネットワークに応じて異なる段階で、または数が増えると、常に IOException がスローされます。現在、Azure クラウド プラットフォームにデプロイしているため、ブロブ ストレージからサーバーへの読み取りは、ネットワークの問題ではありません。

CsvHelper.CsvParserException: A parsing error occurred.

Row: '995' (1 based)
 ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.IO.StreamReader.ReadBuffer(Char[] userBuffer, Int32 userOffset, Int32 desiredChars, Boolean& readToUserBuffer)
   at System.IO.StreamReader.Read(Char[] buffer, Int32 index, Int32 count)
   at CsvHelper.CsvParser.GetChar(Int32& fieldStartPosition, Int32& rawFieldStartPosition, String& field, Boolean prevCharWasDelimiter, Int32& recordPosition, Int32& fieldLength, Boolean isPeek) in c:\Projects\CsvHelper\src\CsvHelper\CsvParser.cs:line 445
   at CsvHelper.CsvParser.ReadLine() in c:\Projects\CsvHelper\src\CsvHelper\CsvParser.cs:line 247
   at CsvHelper.CsvParser.Read() in c:\Projects\CsvHelper\src\CsvHelper\CsvParser.cs:line 108
   --- End of inner exception stack trace ---
   at CsvHelper.CsvParser.Read() in c:\Projects\CsvHelper\src\CsvHelper\CsvParser.cs:line 136
   at CsvHelper.CsvReader.Read() in c:\Projects\CsvHelper\src\CsvHelper\CsvReader.cs:line 173

while (csv.read()) をスローします

 var wc = new WebClient();

            using (var sourceStream = wc.OpenRead(fileUrl))
            {

                using (var csv = new CsvReader(new StreamReader(sourceStream)))
                {


                    while (csv.Read())
                    {
                        try
                        {

//some reading operation
}
 catch (Exception ex)
                        {
                            _logger.Error(ex);
                        }
                    }
                    _logger.InfoFormat("Finished {0} reading data #{1}");

                }
            }

ストリームリーダーのタイムアウト値を設定する場所はどこですか?

4

1 に答える 1

2

クラウド リソース (Azure またはその他のクラウド リソース) を操作する場合は、ファイルを直接読み取らないでください。せいぜい、再試行ロジックを実装して、一時的なエラーを確実に回避する必要があります (一時的なエラーについては、こちら 、あちこちで読む一時なエラー」という用語についてインターネットで検索してください)。

あなたの場合、CloudBlockBlob.DownloadToStreamメソッドの周りに呼び出しをラップすることをお勧めします。したがって、引き続き Stream を使用してファイルを解析できますが、ユーザーに代わってすべての一時的なエラーを処理する .NET Azure Blob API ライブラリのセキュリティの背後で作業することになります。

コードは次のようになります。

// get the CloudblockBlob object
using(MemoryStream blobStream = new MemoryStream())
{
    blobObject.DownloadToStream(blobStream);
    using (var csv = new CsvReader(new StreamReader(blobStream)))
    {
        while (csv.Read())
        {
            try
            {
             //some reading operation
            }
            catch (Exception ex)
            {
                _logger.Error(ex);
            }
        }
        _logger.InfoFormat("Finished {0} reading data #{1}");
    }
}
于 2014-03-11T10:30:35.393 に答える