1

Wir haben einen Prozess, der eine SQL-Lite-Datenbank mit ein paar Tabellen mit etwa 750k Datensätze/100 MB erstellen muss. Es wird an anderer Stelle hochgeladen (Azure Storage Blob). Ich weiß, dass die Azure-App sehr langsame Platten-I/O hat und wenn es lokal ausgeführt wird, dauert es ein paar Sekunden, es kommt immer zu einer Zeitüberschreitung bei Azure. Ich habe versucht, die WEBSITE_LOCAL_CACHE_OPTION auf always und die Verwendung des Temp-Ordners, aber das hat nicht geholfen.SQL Lite auf Azure App Service - Fügt langsam und Timeout

Ich untersuchte die Verwendung einer sql lite in der Speicherdatenbank, aber es scheint keine Möglichkeit zu geben, das Dateisystem zu umgehen, wenn ich das in ein Bytearray (oder Stream) konvertieren möchte, das in einer azure App langsam ist. Idealerweise sollte der Zugriff auf die In-Memory-Datenbank, um in ein Blog zu streamen, optimal sein.

Gibt es in sql lite oder im azure app service Verbesserungen, die es ermöglichen würden, diese in einer angemessenen Zeit zu beenden?

Verwendung der Ormlite des Service-Stacks. Hier ein Beispiel:

using (var trans = dba.OpenTransaction(System.Data.IsolationLevel.ReadUncommitted)) 
       { 
        dbLite.InsertAll(locs); 
        foreach (var s in sales) 
        { 
         dbLite.Insert<Sales>(s); 
        } 

        trans.Commit(); 
       } 

Interessant genug habe ich die Zeit nach unten aus nie arbeiten (10 Minuten hat es geschrieben 5mb, damit ich weiß, es wird nie fertig) auf 4-5 Minuten mit

dbLite.ExecuteSql("pragma page_size = 8192"); 
dbLite.ExecuteSql("pragma synchronous = OFF"); 
dbLite.ExecuteSql("PRAGMA journal_mode = OFF"); 

Dies wird lokal mit 1 Sekunde verglichen. Der auf "Aus" eingestellte Synchronmodus scheint in meinem Szenario am besten zu helfen.

+0

Was die App Serviceplan/Preisstufe für Ihre azur Website? Wo haben Sie die Verarbeitung über das Erstellen einer SQLite-Datenbank und Einfügen von etwa 750k Datensätze/100 MB, eine Anfrage unter Web-Anwendung oder Webjobs ausgeführt? –

+0

Wie viel Zeit kostet es auf azur und was ist die detaillierte Fehlerverfolgung? Für den azure-App-Service gibt es eine Zeitüberschreitung von 230 Sekunden für die Anforderung. Sie können auf dieses [Problem] verweisen (https://stackoverflow.com/questions/38673318/azure-asp-net-webapp-the-request-timed-out)). Darüber hinaus können Sie 'dbLite.InsertAll (sales)' verwenden, anstatt über 'sales' zu iterieren und Verkaufsdaten für eine bessere Leistung einzugeben. –

+0

Ich habe versucht alle/etc. Die Langsamkeit ist auf die langsame Festplatte zurückzuführen, da ich eine Konsole öffnen kann und die Dateien langsam zunehmen sehen. Ich endete mit Hang-Feuer und einem Hintergrund-Thread. Es dauert 4-6 Minuten mit synchron und Journal-Set auf aus und ist 75mb nicht gezippt. – lucuma

Antwort

1

Es scheint, dass die Einstellung dbLite.ExecuteSql("pragma synchronous = OFF"); den größten Vorteil hatte, die Abfrage von geschätzten 140 Minuten auf 4-5 Minuten zu reduzieren. Es gibt Nachteile beim Ausschalten, aber für meinen Fall archivieren wir nur einige Daten, so dass sie minimal sind. Wenn jemand andere Möglichkeiten hat, die Einfügezeit weiter zu erhöhen, werde ich sie akzeptieren, wenn sie die Zeit wesentlich beeinflussen.

Ich habe schließlich meine Zeit auf 1 Minute und 5 Sekunden für eine 70mb Datenbank mit 4 Tabellen und etwa 600k Zeilen.

  dbLite.ExecuteSql("pragma page_size = 8192"); 
      dbLite.ExecuteSql("pragma synchronous = OFF"); 
      dbLite.ExecuteSql("PRAGMA journal_mode = OFF"); 
      dbLite.ExecuteSql("PRAGMA LOCKING_MODE = OFF"); 
      context.WriteLine("Creating Tables"); 

und

using (var trans = dba.OpenTransaction(System.Data.IsolationLevel.ReadUncommitted)) 
{} 

enter image description here

Verwandte Themen