Używam xargs
do wywołania skryptu Pythona w celu przetworzenia około 30 milionów małych plików. Mam nadzieję, że wykorzystam to xargs
do zrównoleglenia procesu. Polecenie, którego używam to:
find ./data -name "*.json" -print0 |
xargs -0 -I{} -P 40 python Convert.py {} > log.txt
Zasadniczo Convert.py
wczyta się w małym pliku json (4kb), trochę przetworzy i zapisze w innym pliku 4kb. Pracuję na serwerze z 40 rdzeniami procesora. Na tym serwerze nie działa żaden inny proces wymagający dużego procesora.
Monitorując htop (btw, czy jest jakiś inny dobry sposób monitorowania wydajności procesora?), Stwierdzam, że -P 40
nie jest tak szybki, jak się spodziewałem. Czasami wszystkie rdzenie zamarzają i zmniejszają się prawie do zera przez 3-4 sekundy, a następnie wracają do 60-70%. Następnie staram się zmniejszyć liczbę równoległych procesów do -P 20-30
, ale wciąż nie jest to bardzo szybkie. Idealnym zachowaniem powinno być przyspieszenie liniowe. Wszelkie sugestie dotyczące równoległego korzystania z xargs?
xargs -P
i >
otwiera się na warunki wyścigu z powodu problemu z linią środkową gnu.org/software/parallel/... Zamiast tego używanie GNU Parallel nie będzie miało tego problemu.