Ik heb een bestaande applicatie die een lijst data moet verwerken. De applicatie is singlethreaded en de verwachte verwerkingstijd ligt op enkele weken. Elke dataregel is onafhankelijk van de anderen, dus de verwerking is te paralleliseren. Verder is er een linuxserver beschikbaar met tientalle cores.
Er is echter veel verschil in verwerkingstijd per dataregel.
Met een kleine testdataset heb ik een script gemaakt dat de lijst verspreid opdeelt en de applicatie via multiprocessing parallel opstart met elk een eigen dataset. Het probleem dat zich voordeed is dat na een half uur de helft van de workers al klaar waren terwijl een uur daarna de laatste pas klaar was. Dit is dus geen optimale inzet van de rekencapaciteit.
Vervolgens heb ik alle data in een queue gezet die per dataregel aan een worker wordt uitgedeeld via subprocess.communicate(dataregel). Hiermee blijven tot het eind van de queue alle workers actief. In deze situatie vraagt de worker data uit de queue, start de applicatie op, wacht tot de applicatie afsluit en de data verwerkt is, en herhaalt dit process.
Het probleem is dat het duizenden keren opstarten van de applicatie meer tijd kost dan het actief houden van alle cores oplevert.
Door de data aan te leveren via .stdin.write(dataregel) wordt volgens mij geen EOF meegestuurd en zal de applicatie actief blijven. Alleen heb ik geen idee hoe ik te weten kom wanneer het verwerken van de data klaar is en een nieuwe dataregel kan worden aangeleverd.
De applicatie geeft wel stdout wanneer verwerking van de data klaar is, maar er kunnen afhankelijk van de dataregel meerdere iteraties nodig zijn die automatisch worden herhaald. Wanneer de output verschijnt is voor mij dus niet duidelijk of de applicatie bezig is met een tweede ronde of wacht op nieuwe input.
Verder zal het bepalen of de applicatie klaar is sneller moeten gebeuren dan het herstarten ervan (dat enkele seconde duurt), om tijd te winnen.
Valt hier nog wat aan te redden of moet ik de eerste methode gebruiken en hopen dat de grootte van de complete lijst ervoor zorgt dat de verwerkingstijden uitmiddelen?
Er is echter veel verschil in verwerkingstijd per dataregel.
Met een kleine testdataset heb ik een script gemaakt dat de lijst verspreid opdeelt en de applicatie via multiprocessing parallel opstart met elk een eigen dataset. Het probleem dat zich voordeed is dat na een half uur de helft van de workers al klaar waren terwijl een uur daarna de laatste pas klaar was. Dit is dus geen optimale inzet van de rekencapaciteit.
Vervolgens heb ik alle data in een queue gezet die per dataregel aan een worker wordt uitgedeeld via subprocess.communicate(dataregel). Hiermee blijven tot het eind van de queue alle workers actief. In deze situatie vraagt de worker data uit de queue, start de applicatie op, wacht tot de applicatie afsluit en de data verwerkt is, en herhaalt dit process.
Het probleem is dat het duizenden keren opstarten van de applicatie meer tijd kost dan het actief houden van alle cores oplevert.

Door de data aan te leveren via .stdin.write(dataregel) wordt volgens mij geen EOF meegestuurd en zal de applicatie actief blijven. Alleen heb ik geen idee hoe ik te weten kom wanneer het verwerken van de data klaar is en een nieuwe dataregel kan worden aangeleverd.
De applicatie geeft wel stdout wanneer verwerking van de data klaar is, maar er kunnen afhankelijk van de dataregel meerdere iteraties nodig zijn die automatisch worden herhaald. Wanneer de output verschijnt is voor mij dus niet duidelijk of de applicatie bezig is met een tweede ronde of wacht op nieuwe input.
Verder zal het bepalen of de applicatie klaar is sneller moeten gebeuren dan het herstarten ervan (dat enkele seconde duurt), om tijd te winnen.
Valt hier nog wat aan te redden of moet ik de eerste methode gebruiken en hopen dat de grootte van de complete lijst ervoor zorgt dat de verwerkingstijden uitmiddelen?
Hoe meer ik weet,
hoe meer ik weet,
dat ik niets weet.