1

Nous avons un processus qui a besoin de créer une base de données sql lite avec quelques tables avec environ 750k enregistrements/100mb. Il est téléchargé ailleurs (Azure Storage Blob). Je sais que les applications Azure ont des E/S de disque très lentes et, lorsque vous les exécutez localement, cela prend quelques secondes, cela expire toujours sur Azure. J'ai essayé de définir le WEBSITE_LOCAL_CACHE_OPTION à always et en utilisant le dossier temporaire, mais cela n'a pas aidé. J'ai cherché dans l'utilisation d'un SQL sql dans la base de données de la mémoire, mais il semble y avoir aucun moyen d'éviter le système de fichiers si je veux le convertir en un tableau d'octets (ou flux) lent dans une application azure. Idéalement, avoir accès à la base de données en mémoire pour diffuser sur un blog serait le meilleur des cas.SQL Lite sur Azure App Service - Insertion lente et timeout

Y a-t-il des ajustements dans sql lite ou dans le service d'application azure qui permettraient de terminer dans un délai raisonnable?

Utilisation de l'ormlite de la pile de service. Voici un exemple:

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

        trans.Commit(); 
       } 

assez intéressant, je suis arrivé le temps d'arrêt de travail ne (10 minutes, il a écrit 5MB donc je sais que ce ne sera jamais fini) à 4-5 minutes avec

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

Ceci est comparé à 1 seconde localement. Le mode synchrone réglé sur off semble aider le plus dans mon scénario.

+0

Quel est le niveau Plan/prix de service App pour votre site web d'azur? Où avez-vous exécuté le traitement sur la création d'une base de données sqlite et insérez environ 750k enregistrements/100mb, une requête sous application web ou webjobs? –

+0

Combien de temps cela coûte-t-il sur azure et quelle est la trace d'erreur détaillée? Pour le service d'application Azur, il y a un délai d'attente de 230 secondes pour la demande, vous pouvez vous référer à cette [question] (https://stackoverflow.com/questions/38673318/azure-asp-net-webapp-the-request-timed-out). De plus, vous pouvez utiliser 'dbLite.InsertAll (sales)' au lieu d'itérer sur 'sales' et insérer des données de vente pour de meilleures performances. –

+0

J'ai essayé d'insérer tout/etc. La lenteur est due au disque lent io car je peux ouvrir une console et voir les fichiers augmenter lentement. J'ai fini par utiliser le feu et un fil de fond. Cela prend 4-6 minutes avec le synchrone et le journal mis hors tension et est 75mb non zippé. – lucuma

Répondre

1

Il semble que le paramètre dbLite.ExecuteSql("pragma synchronous = OFF"); a eu le plus grand avantage de réduire la requête d'environ 140 minutes à 4-5 minutes. Il y a des inconvénients à l'éteindre, mais pour mon cas, nous ne faisons que l'archivage de certaines données afin qu'elles soient minimales. Si quelqu'un a d'autres façons d'augmenter le temps d'insertion, je les accepterai si elles ont un impact sur le temps.

J'ai finalement perdu mon temps à 1 minute et 5 secondes pour une base de données de 70 Mo avec 4 tables et environ 600 000 lignes.

  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"); 

et

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

enter image description here