sql >> Database >  >> RDS >> PostgreSQL

Een bestand schrijven met meerdere threads

Gedeelde bron ==geschil

Schrijven naar een normaal bestand is per definitie een geserialiseerde bewerking. Je krijgt geen prestatie door te proberen ernaar te schrijven vanuit meerdere threads, I/O is een eindig begrensde bron met een orde van grootte minder bandbreedte dan zelfs de langzaamste of meest overbelaste CPU.

Gelijktijdige toegang tot een gedeelde bron kan ingewikkeld (en traag) zijn

Als je meerdere threads hebt die dure berekeningen doen, heb je opties, als je gewoon meerdere threads gebruikt omdat je denkt dat je iets gaat versnellen, doe je gewoon het tegenovergestelde. Contention for I/O vertraagt ​​altijd de toegang tot de bron, het versnelt het nooit vanwege de lock-wachten en andere overhead.

U moet een kritieke sectie hebben die is beveiligd en die slechts één schrijver tegelijk toestaat. Zoek gewoon de broncode op voor elke logboekschrijver die gelijktijdigheid ondersteunt en u zult zien dat er maar één thread is die naar het bestand schrijft.

Als uw toepassing voornamelijk is:

  1. CPU-gebonden: Je kunt een vergrendelingsmechanisme/dataconstructie gebruiken om slechts één van de vele threads tegelijk naar het bestand te laten schrijven, wat vanuit een gelijktijdigheidsstandpunt nutteloos zal zijn als een naïeve oplossing; Als deze threads CPU-gebonden zijn met weinig I/O, zou dit kunnen werken.

  2. I/O-gebonden: Dit is het meest voorkomende geval, je moet een systeem voor het doorgeven van berichten gebruiken met een of andere wachtrij en alle threads naar een wachtrij/buffer laten posten en een enkele thread eruit halen en naar het bestand schrijven. Dit is de meest schaalbare en gemakkelijkst te implementeren oplossing.

Journaling - Asynchroon schrijven

Als u een enkel supergroot bestand moet maken waarbij de schrijfvolgorde niet belangrijk is en het programma CPU-gebonden is, kunt u een journaaltechniek gebruiken.

Laat elk process schrijf naar een apart bestand en voeg vervolgens de meerdere bestanden samen tot één groot bestand aan het einde. Dit is een zeer oude school low tech oplossing die goed werkt en al tientallen jaren werkt.

Het is duidelijk dat hoe meer opslag-I/O je hebt, hoe beter dit zal presteren op de eindconcat.



  1. Tabel gewaardeerd Parameter Equivalent in Postgresql

  2. invoerbestand lijkt een dump in tekstformaat te zijn. Gebruik alstublieft psql

  3. 2 manieren om dubbele rijen in Oracle te verwijderen

  4. Oracle ODP.Net en EF CodeFirst - SaveChanges-fout