フラット ファイル サイズが 1 GB を超えています。ファイルを解析して DB に挿入する必要があります。
方法 1: フラットファイルを解析して csv に変換します。次に、SQLで一括挿入を使用します。
問題:
ファイルの読み取りに非同期を使用すると、System.OutOfMemoryException がスローされます
約30分(サイズにもよりますが)かかります。
時間を短縮するためにデータ構造を効率的に使用する必要があるか、またはその他の効率的な方法論を使用する必要がありますか?
フラット ファイル サイズが 1 GB を超えています。ファイルを解析して DB に挿入する必要があります。
方法 1: フラットファイルを解析して csv に変換します。次に、SQLで一括挿入を使用します。
問題:
ファイルの読み取りに非同期を使用すると、System.OutOfMemoryException がスローされます
約30分(サイズにもよりますが)かかります。
時間を短縮するためにデータ構造を効率的に使用する必要があるか、またはその他の効率的な方法論を使用する必要がありますか?
おそらくここで質問を確認してください。具体的には、.Net 4.0 を使用している場合は、MemoryMappedFileの使用について言及しています。
ただし、データベースに挿入するだけの場合、C# 経由でこれを取り込む必要は本当にあるのでしょうか? こちらの記事に従って、SQL で実行することを検討してください。
このようにBinaryReaderで単純なFileStreamを使用できます
Boolean isSaving = true, savedOk = false;
new Task(new Action(() =>
{
try
{
string fileName = "filename.txt";
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
BinaryReader br = new BinaryReader(fs);
long size = new FileInfo(fileName).Length;
int bytesPerRead = (int)(size < 512000 ? size : 512000);
byte[] past = br.ReadBytes(bytesPerRead);
int offset = 0;
while (offset < size)
{
//TODO - SAVE YOUR BYTE ARRAY TO DB USING WCF OR LOCAL PROC
offset = offset + bytesPerRead;
bytesPerRead = (int)(size - offset < 512000 ? size - offset : 512000);
past = br.ReadBytes(bytesPerRead);
}
savedOk = true;
}
}
catch (Exception ex) { savedOk = false; }
isSaving = false;
})).Start();
while (isSaving)
{
//DOUPDATES
};