2016-04-08 24 views
0

I (70MB civarında) büyük bir SQL komut dosyası var ve belleğe okuma gerekir ve ardından GO tablolarda bölün.File.ReadAllText OutOfMemoryException

ben aşağıdakileri yapacak, ama OutOfMemoryException alıyorum:

var script = File.ReadAllText(scriptFile); 
var scriptName = Path.GetFileName(scriptFile); 
var commands = Regex.Split(script, "^GO\r\n", RegexOptions.Multiline | RegexOptions.IgnoreCase); 

Sonra commands her komut fragman için, ben ExecuteNonQuery diyoruz. Bu büyük betik dosyasını yüklemeye çalışana kadar her şey yolunda gidiyor.

Bu metin dosyasını daha verimli bir şekilde ayrıştırma önerileriniz var mı? Bir seferde bir satır oku StringBuilder içine tampon ve bir "git" satırını gördüğünde daha sonra tampon verecektir bu

public static IEnumerable<string> SplitScriptOnGo(string scriptPath) 
{ 
    var buffer = new StringBuilder(); 
    foreach (var line in File.ReadLines(scriptPath)) 
    { 
     if (line == "GO") 
     { 
      yield return buffer.ToString(); 
      buffer.Clear(); 
     } 
     else 
     { 
      buffer.AppendLine(line); 
     } 
    } 
} 

gibi

+1

Az önce bize sonra temizlemelisiniz akım grubunun işlenmesi ve sonraki satıra geçmek gerekir "GO" hit sonra bir kez, satır satır okumak ve bir listeye eklemek gerekir. –

+0

Bunu [bu] (http://weblogs.asp.net/jongalloway/Handling-_2200_GO_2200_-Separators-in-SQL-Scripts-_2D00_-the-easy-way) tamamından dosyası yüklenirken ne olmadıkça okumak isteyebilirsiniz tüm hafızanızı kullanır. – juharr

+0

@juharr Aslında bunu dün okudum. –

cevap

3

deneyin şey. ToList'u kullanmadığınız sürece, sonuçların üzerinde yineleyebilir ve komut dosyasının tamamını belleğe okumadan her SQL ifadesini çalıştırabilirsiniz.

0

ReadAllText() veya Split() üzerinde başarısız mı?

Ben senin sistem özelliklerini bilmiyorum ama yetersiz hafızaya sahip şüphe, benim tahminim Split ile başarısız() ve bölünmüş bir şey sonsuz bir döngüye neden olmasıdır.

Belki yerine sadece kadar okuyabilir aynı anda her şeyi okumaya ilk önce vb sonraki seferde için okumaya devam, yürütmek, "git"? Sonunda, ya tüm dosyayı işleyebilir ya da başarısız olur (hangi noktada "GO" ifadesinin, hata ayıklayıcıda okuduğunuz dizeye bakarak sorunlara neden olduğunu bilirsiniz).

İlgili konular