Po wielu testach w końcu odkryłem, że problem w ogóle nie dotyczył frameworka Entity ani NpgSql, ale opóźnienie, które widziałem, było spowodowane buforowaniem zapisu. Zawsze pisałem plik 30 MB przed wstawieniem wiersza do tabeli 1 i wierzyłem, że zapisywanie pliku zostało wykonane po zwróceniu File.WriteAllBytes, więc nie wpłynie to na żadne przyszłe instrukcje dotyczące czasu. Jednak w warstwie systemu operacyjnego do czasu uruchomienia instrukcji INSERT tak naprawdę nie zapisano na dysk, co spowodowało sztuczne opóźnienie instrukcji INSERT.
Udowodniłem to następującym kodem:
Stopwatch sw1 = new Stopwatch();
sw1.Start();
File.WriteAllBytes(myBytes);
sw1.Stop();
Thread.Sleep(1000);
Stopwatch sw2 = new Stopwatch();
sw2.Start();
MethodThatInsertsIntoTable1();
sw2.Stop();
stoper 1 pokazał, że File.WriteAllBytes zawsze zajmował około 500 ms, a stoper 2 mierzył czas około 20 do 30 sekund.
Jeśli zmienię MethodThatInsertsIntoTable1 na wstawienie do innej tabeli, to i tak zajmie to od 20 do 30 sekund, niezależnie od tabeli.
Jeśli zwiększę Thread.Sleep(1000) do Thread.Sleep(30000), stoper 2 zarejestruje, że wstawienie zajmuje mniej niż 10 milisekund.
Pokazuje to, że nawet po tym, jak File.WriteAllBytes zwróci kontrolę do programu, tak naprawdę nie zapisano pliku na dysku.
Środowisko, na którym działałem, to Linux na Raspberry Pi. Test prędkości zapisu potwierdza, że moja prędkość zapisu na kartę SD wynosi nieco ponad 1 MB/s, co zgadzałoby się z wynikami, które widzę, 20-30 sekund na zapisanie pliku 30 MB, nie można tego zrobić w ciągu 500 ms ten stoper 1 tak mówi.
Inny użytkownik wydaje się mieć problem z tego powodu w File.WriteAllBytes robi nie blokuj
Po dodaniu zewnętrznego dysku twardego SSD USB do raspberry pi i zmianie, aby zapisać tam plik, zapisanie pliku zajmuje tylko 0,5 sekundy, a problem znika.