Piszę wielowątkowy dekompresor w Pythonie. Każdy wątek musi uzyskać dostęp do innego fragmentu pliku wejściowego.Czytanie pojedynczego pliku z wielu wątków w pythonie
Uwaga 1: nie można załadować całego pliku, ponieważ mieści się w zakresie od 15 Gb do 200 Gb; Nie używam wielowątkowości do przyspieszenia odczytu danych, ale dekompresji danych, chcę tylko upewnić się, że odczytane dane nie spowalniają dekompresji.
Uwaga 2: GIL nie stanowi problemu, ponieważ główna funkcja dekompresora jest rozszerzeniem C i wywołuje Py_ALLOW_THREADS, dzięki czemu GIL jest zwalniany podczas dekompresji. Druga faza dekompresji używa numpy, która jest również wolna od GIL.
1) Sądziłem, że to nie działa po prostu udostępnić obiekt dekompresor (które zasadniczo otacza obiekt pliku), ponieważ jeśli nawlec wywołuje następujące:
decompressor.seek(x)
decompressor.read(1024)
i nici B robi to samo, gwint A może skończyć odczyt z przesunięcia B wątku. Czy to jest poprawne?
2) Teraz po prostu sprawię, że każda nitka stworzy swoją własną wersję dekompresora i wygląda na to, że działa, ale nie jestem pewien, czy jest to najlepsze podejście. uznałem te możliwości:
dodać coś takiego
seekandread(from_where, length)
do klasy dekompresor, który uzyskuje blokadę, szuka, czyta i zwalnia blokadę;
Utwórz wątek, który czeka na żądania odczytu i wykonuje je we właściwej kolejności.
Czy brakuje mi oczywistego rozwiązania? Czy istnieje znacząca różnica w wydajności między tymi metodami?
Dzięki
Odczytywanie pliku w trybie wielowątkowym w rzeczywistości spowalnia proces, gdy masz dysk twardy. Igła musi przeskakiwać z jednego miejsca do drugiego zamiast pracować w sposób powtarzalny. Powinieneś załadować plik przed jego przetworzeniem. –
Nie można załadować całego pliku, ponieważ mieści się w zakresie od 15 Gb do 200 Gb; Nie używam wielowątkowości do przyspieszenia odczytu danych, ale dekompresji danych, chciałem tylko upewnić się, że odczytane dane nie spowalniają dekompresji. – Alberto
Oczywiście może to dotyczyć dysków SSD. Nie mam pojęcia o tym temacie. Nie powinieneś przekazywać tego za pomocą sprzętu. Gdy dyski SSD są dość powszechne, wykonywanie we/wy w trybie wielowątkowym może być wydajne. –