Nach vielen Tests stellte ich schließlich fest, dass das Problem überhaupt nicht im Entity-Framework oder NpgSql lag, aber die Verzögerung, die ich sah, wurde durch das Zwischenspeichern von Schreibvorgängen verursacht. Ich habe immer eine 30-MB-Datei geschrieben, bevor ich eine Zeile in Tabelle 1 eingefügt habe, und ich war der Meinung, dass das Schreiben der Datei nach der Rückgabe von File.WriteAllBytes erfolgt ist, damit es keine zukünftigen Timing-Anweisungen beeinflusst. Auf der Betriebssystemebene war das Schreiben auf die Festplatte jedoch noch nicht abgeschlossen, als die Insert-Anweisung ausgeführt wurde, wodurch die Insert-Anweisung künstlich verzögert wurde.
Ich habe dies mit folgendem Code bewiesen:
Stopwatch sw1 = new Stopwatch();
sw1.Start();
File.WriteAllBytes(myBytes);
sw1.Stop();
Thread.Sleep(1000);
Stopwatch sw2 = new Stopwatch();
sw2.Start();
MethodThatInsertsIntoTable1();
sw2.Stop();
Stoppuhr 1 zeigte, dass File.WriteAllBytes immer etwa 500 ms dauerte, dann dauerte Stoppuhr 2 etwa 20 bis 30 Sekunden.
Wenn ich MethodThatInsertsIntoTable1 ändere, um es in eine andere Tabelle einzufügen, dauert es immer noch 20 bis 30 Sekunden, unabhängig von der Tabelle.
Wenn ich Thread.Sleep(1000) auf Thread.Sleep(30000) erhöhe, zeichnet Stoppuhr 2 auf, dass das Einfügen weniger als 10 Millisekunden dauert.
Dies zeigt, dass selbst nachdem File.WriteAllBytes die Kontrolle an das Programm zurückgegeben hat, es noch nicht wirklich fertig ist, die Datei auf die Festplatte zu schreiben.
Die Umgebung, in der ich lief, war Linux auf einem Himbeer-Pi. Ein Schreibgeschwindigkeitstest bestätigt, dass meine Schreibgeschwindigkeit auf die SD-Karte knapp über 1 MB/s liegt, was mit den Ergebnissen übereinstimmen würde, die ich sehe, 20-30 Sekunden, um eine 30-MB-Datei zu schreiben, es könnte unmöglich in den 500 ms durchgeführt werden dass Stoppuhr 1 sagt, dass es so war.
Ein anderer Benutzer scheint aufgrund dessen ein Problem in File.WriteAllBytes zu haben nicht blockieren
Nachdem Sie dem Himbeer-Pi eine externe SSD-USB-Festplatte hinzugefügt und die Datei stattdessen dort gespeichert haben, dauert das Speichern der Datei nur 0,5 Sekunden und das Problem verschwindet.