Wpis z mikrobloga

Sposób na równoległe pobieranie dużej ilości danych w linuksie. Dla przykładu z użyciem youtube-dl.

Zbieramy sobie linki wideo do "temp.txt". Będą one służyć za argumenty dla polecenia youtube-dl. Instalujemy gnu-parallel (w debianach pakiet o nazwie parallel). Wykonujemy polecenie:

cat temp.txt | parallel -j40 youtube-dl --no-progress {} \;

Przy czym:

cat temp.txt | ← Podaje listę argumentów dla parallel z pliku temp.txt

-jn ← liczba n wątków, które stworzy parallel. Jeśli chcemy by pobierało się niezależnie 40 różnych filmów podajemy argument -j40

youtube-dl --no-progress ← Polecenie, które wykona parallel. Może być tu inne polecenie np wget lub curl. '--no-progress' to flaga dla youtube-dl.

{} \; ← w ten sposób parallel przekazuje poszczególne linie jako argumenty dla polecenia, które ma wykonać.

Podsumowanie:

Dla każdej linijki tekstu wyciągniętej z temp.txt przez cat polecenie paralell uruchomi proces youtube-dl z tą linią jako argument. Jeśli jeden proces się skończy parallel prześle kolejną linię z pliku jako argument do nowego procesu - innymi słowy jeśli pobiera się określona liczba filmów i jedno pobieranie się zakończy to zacznie się pobieranie nowego filmu aż się nie skończą linki w pliku temp.txt.

#linux #bash #systemtip i #linuxpro
  • 7
  • Odpowiedz
@ppidd_: Wiem, możesz np tworzyć procesy w pętli i wrzucać je w tło. Wybrałem ten sposób bo jest bardzo prosty i uniwersalny oraz kiedyś za pomocą parallel zrobiłem wielokrotne proste składanie i rysowanie obrazów z pomocą imagemagick (swoją drogą kiedyś też o tym jakiś wpis zrobię bo metoda niby prosta ale jak rozmawiam ze znajomymi albo szukałem w internecie to praktycznie cisza na ten temat).

Tu dodatkowo masz taki plus i
  • Odpowiedz
@m__ostry: toż to ja wiem co to jest aria ale mówimy o zupełnie różnych rozwiązaniach. youtube-dl wyciąga wideo z linków i je merge'uje do kontenera. Do arii musiałbym pisać specjalny skrypt a i tak nie działało by to tak fajnie jak tutaj, a do tego nie mieściło by się to w jednej linii.
  • Odpowiedz
@Kryspin013 IMHO lepiej użyć youtube-dl do wyciągnięcia URI, a potem aria2 do samego pobierana. Tak jak napisałeś, YouTube ogranicza prędkość każdego połączenia, ale jak połączysz się 5 razy z tym samym filmem, masz 5 razy prędkość pojedynczego połączenia (nie wiem, jak działa w innych serwisach).

Plus: Pierwszy plik z listy jest pobrany szybciej (zamiast 5 plików z prędkością z, pobierasz jeden z prędkością 5z). Możesz szybciej zacząć oglądać, a
  • Odpowiedz
@m__ostry: Większość współczesnych serwisów trzyma wideo niezależnie od audio. Pobieranie w ten sposób i tak mija się z celem bo musisz potem wrzucić wideo i audio do kontenera, który to ogarnie. Druga sprawa, musiałbyś pisać osobno warunki do niektórych serwisów. I ostatnia rzecz. Tak aria jest spoko, ale ty tutaj mówisz o n połączeniach dla jednego pliku a ja o masowym pobieraniu n liczby filmów na raz.
  • Odpowiedz
@Kryspin013:

(...) musisz potem wrzucić wideo i audio do kontenera, który to ogarnie (...)

ffmpeg -i video -i audio -c copy -map 0 -map 1 output.mkv — dalej kilkanaście sekund "obliczeń" dla ffmpeg i gotowe. Samo video pobiera się (co prawda przy moim internecie) ze dwa rzędy wielkości dłużej.

(...) musiałbyś pisać osobno warunki do niektórych serwisów (...)

Nie za bardzo rozumiem, co masz tutaj na myśli. Mógłbyś rozwinąć?

(...) ty
  • Odpowiedz