StreamReader を介して 800MB のテキスト ファイルを DataTable にロードしようとしているときに、OutOfMemory 例外が発生しました。バッチでメモリ ストリームから DataTable をロードする方法があるかどうか疑問に思っていました。すぐ。
ここでは私のグーグルはあまり役に立ちませんでしたが、これを行う簡単な方法があるはずです。最終的には、SqlBulkCopy を使用して DataTables を MS SQL db に書き込むことになるので、説明した方法よりも簡単な方法がある場合は、正しい方向への迅速なポインターに感謝します。
編集 - これが私が実行しているコードです:
public static DataTable PopulateDataTableFromText(DataTable dt, string txtSource)
{
StreamReader sr = new StreamReader(txtSource);
DataRow dr;
int dtCount = dt.Columns.Count;
string input;
int i = 0;
while ((input = sr.ReadLine()) != null)
{
try
{
string[] stringRows = input.Split(new char[] { '\t' });
dr = dt.NewRow();
for (int a = 0; a < dtCount; a++)
{
string dataType = dt.Columns[a].DataType.ToString();
if (stringRows[a] == "" && (dataType == "System.Int32" || dataType == "System.Int64"))
{
stringRows[a] = "0";
}
dr[a] = Convert.ChangeType(stringRows[a], dt.Columns[a].DataType);
}
dt.Rows.Add(dr);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
i++;
}
return dt;
}
そして、返されるエラーは次のとおりです。
「System.OutOfMemoryException: 'System.OutOfMemoryException' 型の例外がスローされまし
た。System.String.Split(Char[] セパレーター、Int32 カウント、StringSplitOptions オプション)
で System.String.Split(Char[] セパレーター}
で Harvester.Config .PopulateDataTableFromText(DataTable dt, String txtSource) in C:...."
データを SQL に直接ロードするという提案について - 私は C# に関しては少し初心者ですが、基本的にはそれが私がやっていることだと思いましたか? SqlBulkCopy.WriteToServer は、テキスト ファイルから作成した DataTable を取得し、SQL にインポートします。私が見逃しているこれを行うためのさらに簡単な方法はありますか?
編集: 言い忘れましたが、このコードは SQL Server と同じサーバーでは実行されません。データ テキスト ファイルはサーバー B にあり、サーバー A のテーブルに書き込む必要があります。これにより、bcp を使用できなくなりますか?