2009-07-10 3 views
2

Mit C# möchte ich 1.000.000 Dateien aus der DB generieren, jeder Datensatz in einer separaten Datei. Was ist der beste Weg, um diese Dateien in kürzester Zeit zu generieren?Der beste Code zum Generieren von 1.000.000 Dateien aus der Datenbank

Hier ist mein Code ohne Gewinde:

AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit); // to calculate the execution time in case of using threading 
    SqlCommand cmd = new SqlCommand(@"select top 1000000 p1+','+p2+','+p3+','+p4 as line from lines ", con); 

    con.Open(); 
    var rdr = cmd.ExecuteReader(); 
    int i = 0; 
    while (rdr.Read()) 
    { 

     string line = rdr.Getring(0); 
     string filename = String.Format("file{0}.txt", ++i); 
     File.WriteAllText(filename, line); 

    } 
    rdr.Close(); 
    con.Close(); 
+0

Verwenden Sie C# 3.0? – abhilash

+0

Er müsste wegen des var-Schlüsselworts in seinem Code sein. – Kredns

+0

Wollen Sie wirklich alle in einem Verzeichnis? –

Antwort

3

Da Ihre Operationen werden IO gebunden und nicht die CPU gebunden ist, ist der beste Weg 2 Fäden zu haben, eine, die die Datensätze aus DB liest und es in ein setzen Warteschlange, der andere liest aus der Warteschlange und generiert die Dateien.

Alternativ können Sie die CLR-Thread-Pool für das verwenden, so etwas wie

while (rdr.Read()) 
    { 

     string line = rdr.Getring(0); 
     ThreadPool.QueueUserWorkItem (new WaitCallback(writeData), line); 

    } 

und writedata wie

static void writeData(Object line) 
{ 
      string filename = String.Format("file{0}.txt", ++i); 
      File.WriteAllText(filename, line); 
} 

Der Nachteil der Verwendung des Thread aussehen würde, wird man mehr Threads könnte am Ende Da Ihre Threads in IO die meiste Zeit blockiert sind, erstellt der Thread-Pool neue Threads, um Ihre Anforderungen zu bearbeiten.

Sie können zuerst den Threadpool testen und die Leistung messen. Wenn Sie nicht zufrieden sind, können Sie den Ansatz mit 2 Threads, 1 Queue versuchen; bekannt als Producer/Consumer Problem.

+0

Die Verwendung von Thread-Pool generiert nur 2713 Dateien und beenden Sie meine Anwendung. unerwartetes Verhalten. – Ammroff

0

Sie würden davon profitieren, mehr Threads zu haben; Der beste Weg, die genaue Zahl herauszufinden, ist empirisch, aber beschränken Sie sich nicht auf einen pro CPU-Kern, wie Sie es bei CPU-gebundenen Aufgaben tun würden. Der einfachste Weg besteht darin, einen ThreadPool zu verwenden, aber ein Producer/Consumer-Warteschlangensystem wäre flexibler und abstimmbarer.

0

Warum nicht das SSIS-Paket verwenden? Soll es nicht solche Dinge tun?

+0

Haben Sie einen Artikel über das SSIS-Paket zum Generieren von Dateien? – Ammroff

0

This könnte helfen.

+0

das funktioniert gut, wenn Ihre Datenbank nur SQL Server ist :) Ich hoffe, die meisten Leute verwenden :) – mfawzymkh

+1

Obwohl er die Verbindungszeichenfolge nicht gezeigt hat, schlägt die Verwendung von SQLCommand vor, dass er SQL als Datenbank verwendet. Daher denke ich, dass dies verwendet werden kann. – danish

+0

Ja, ich benutze SQLserver 2008, und ich kann keinen Weg finden, jeden Datensatz in einer einzigen Datei mit SSIS, zu generieren Kann jemand helfen? – Ammroff

Verwandte Themen