Po mnoha testech jsem nakonec zjistil, že problém vůbec nebyl v Entity framework nebo NpgSql, ale zpoždění, které jsem viděl, bylo způsobeno ukládáním do mezipaměti. Vždy jsem psal 30MB soubor před vložením řádku do tabulky 1 a věřil jsem, že zápis souboru byl proveden po návratu File.WriteAllBytes, takže to nebude mít vliv na žádné budoucí příkazy časování. Na vrstvě OS však zápis na disk nebyl ve skutečnosti proveden v době, kdy byl spuštěn příkaz insert, což způsobilo umělé zpoždění příkazu insert.
Dokázal jsem to pomocí následujícího kódu:
Stopwatch sw1 = new Stopwatch();
sw1.Start();
File.WriteAllBytes(myBytes);
sw1.Stop();
Thread.Sleep(1000);
Stopwatch sw2 = new Stopwatch();
sw2.Start();
MethodThatInsertsIntoTable1();
sw2.Stop();
stopky 1 ukázaly, že File.WriteAllBytes vždy trvalo asi 500 ms, pak stopky 2 načasovaly asi 20 až 30 sekund.
Pokud změním MethodThatInsertsIntoTable1 na vložení do jiné tabulky, bude to stále trvat 20 až 30 sekund bez ohledu na tabulku.
Pokud zvýším Thread.Sleep(1000) na Thread.Sleep(30000), stopky 2 zaznamenají, že vložení trvá méně než 10 milisekund.
To ukazuje, že i poté, co File.WriteAllBytes vrátí řízení programu, není ve skutečnosti zápis souboru na disk skutečně dokončen.
Prostředí, ve kterém jsem běžel, byl linux na raspberry pi. Test rychlosti zápisu potvrzuje, že moje rychlost zápisu na SD kartu je něco málo přes 1 MB/s, což by odpovídalo výsledkům, které vidím, 20–30 sekund na zapsání 30 MB souboru, to by nebylo možné provést za 500 ms že stopky 1 říkají, že to tak bylo.
Zdá se, že kvůli tomu má jiný uživatel problém v File.WriteAllBytes ano neblokovat
Po přidání externího SSD USB HDD do raspberry pi a změně tak, aby se soubor místo toho uložil, uložení souboru trvá pouze 0,5 sekundy a problém zmizí.