Ik heb een applicatie gebouwd in Ruby on Rails die de HTML scraped van meerdere sites. Elke site heeft zijn eigen scraper. Om de sites zelf zo min mogelijk te belasten zit er in een delay (sleep) in van 120 seconden tussen het ophalen van twee pagina's.
Alle scrapers lopen enkele keren per dag. Om ervoor te zorgen dat scrapers niet op elkaar hoeven te wachten, heeft elke scraper zijn eigen proces. De reden dat ik wil dat scrapers niet op elkaar hoeven te wachten is dat als een scraper zijn 'run' niet haalt voordat hij opnieuw moet gaan lopen, andere scrapers daar geen last van hebben. Met andere woorden, als voor een scraper een wachtrij ontstaat, dan hebben andere scrapers daar geen last van.
Geheugen technisch is deze oplossing loeiduur, maar volgens mij technisch wel de simpelste oplossing. Toch vraag ik me dat een beetje af...
Mijn huidige opstelling is als volgt:
Elke scraper heeft zijn eigen proces van ca. 80 MB. Bij 5 scrapers kost me dit dus al 400 MB. Door de componenten van Rails die ik niet gebruik niet in te laden win ik zo'n 40% aan geheugen. Elk proces wordt ca. 45 MB
Idealiter lijkt mij dat ik het aantal processen wat loopt moet verminderen. Ik zat zelf aan een aantal mogelijkheden te denken:
1. Stop alle scrapers die heel snel hun 'run' doen in 1 proces. Zij hebben immers toch nooit last van elkaar. Dat is een vrij makkelijke oplossing.
2. Stop alle scrapers in 1 proces en draai alle scrapers paralel in 1 proces. Dit moet volgens mij mbv paralel programmeren gebeuren. Deze oplossing lijkt mij zo idioot ingewikkeld dat het economisch gezien veel voordeliger is om dan maar enkele gigabytes RAM bij te kopen.
3. Processen alleen starten als ze ook daadwerkelijk moeten lopen... Dit heeft geen zin; nu lopen soms alle processen tegelijk.
Ik hoop dat ik het een beetje helder heb uitgelegd hoe mijn opstelling is en wat mijn probleem is.
Eigenlijk komt het erop neer dat ik het aantal processen wil verminderen, maar hoe....?
Heeft iemand een idee hoe ik het beste het aantal processen kan verminderen?
Kan ik vermijden dat door de delay (sleep) het hele proces gewoon 120 seconden stilstaat; ik kan me geen strategie bedenken om hier omheen te werken?
Alle scrapers lopen enkele keren per dag. Om ervoor te zorgen dat scrapers niet op elkaar hoeven te wachten, heeft elke scraper zijn eigen proces. De reden dat ik wil dat scrapers niet op elkaar hoeven te wachten is dat als een scraper zijn 'run' niet haalt voordat hij opnieuw moet gaan lopen, andere scrapers daar geen last van hebben. Met andere woorden, als voor een scraper een wachtrij ontstaat, dan hebben andere scrapers daar geen last van.
Geheugen technisch is deze oplossing loeiduur, maar volgens mij technisch wel de simpelste oplossing. Toch vraag ik me dat een beetje af...
Mijn huidige opstelling is als volgt:
Elke scraper heeft zijn eigen proces van ca. 80 MB. Bij 5 scrapers kost me dit dus al 400 MB. Door de componenten van Rails die ik niet gebruik niet in te laden win ik zo'n 40% aan geheugen. Elk proces wordt ca. 45 MB
Idealiter lijkt mij dat ik het aantal processen wat loopt moet verminderen. Ik zat zelf aan een aantal mogelijkheden te denken:
1. Stop alle scrapers die heel snel hun 'run' doen in 1 proces. Zij hebben immers toch nooit last van elkaar. Dat is een vrij makkelijke oplossing.
2. Stop alle scrapers in 1 proces en draai alle scrapers paralel in 1 proces. Dit moet volgens mij mbv paralel programmeren gebeuren. Deze oplossing lijkt mij zo idioot ingewikkeld dat het economisch gezien veel voordeliger is om dan maar enkele gigabytes RAM bij te kopen.
3. Processen alleen starten als ze ook daadwerkelijk moeten lopen... Dit heeft geen zin; nu lopen soms alle processen tegelijk.
Ik hoop dat ik het een beetje helder heb uitgelegd hoe mijn opstelling is en wat mijn probleem is.
Eigenlijk komt het erop neer dat ik het aantal processen wil verminderen, maar hoe....?
Heeft iemand een idee hoe ik het beste het aantal processen kan verminderen?
Kan ik vermijden dat door de delay (sleep) het hele proces gewoon 120 seconden stilstaat; ik kan me geen strategie bedenken om hier omheen te werken?