Format kompresji (ale niekoniecznie algorytm) musi być świadomy faktu, że można użyć wielu wątków. Lub raczej, niekoniecznie, że używasz wielu wątków, ale kompresujesz oryginalne dane w wielu krokach, równolegle lub w inny sposób.
Pozwól mi wyjaśnić.
Większość algorytmów kompresji kompresuje dane w sposób sekwencyjny. Wszelkie dane można skompresować, korzystając z informacji uzyskanych z już skompresowanych danych. Na przykład, jeśli kompresujesz książkę przez złego autora, który wiele razy używa tych samych słów, stereotypów i zdań, zanim algorytm kompresji przejdzie do drugiego wystąpienia tych rzeczy, zwykle będzie w stanie skompresować obecne wystąpienie lepiej niż pierwsze wystąpienie.
Jednak efektem ubocznym tego jest to, że nie można naprawdę połączyć ze sobą dwóch skompresowanych plików bez ich dekompresji i ponownej kompresji w postaci jednego strumienia. Wiedza z jednego pliku nie pasuje do drugiego pliku.
Rozwiązaniem jest oczywiście wyjaśnienie procedury dekompresji: "Hej, właśnie przełączyłem się na zupełnie nowy strumień danych, zacznij od nowa, budując wiedzę o danych".
Jeśli format kompresji obsługuje taki kod, można z łatwością skompresować wiele części jednocześnie.
Na przykład plik 1GB można podzielić na 4 pliki 256 MB, skompresować każdą część na oddzielnym rdzeniu, a następnie połączyć je na końcu.
Jeśli tworzysz własny format kompresji, możesz oczywiście samodzielnie uzyskać wsparcie.
Bez względu na to, czy funkcja .ZIP, czy .RAR lub którykolwiek ze znanych formatów kompresji obsługuje ten problem, jest mi nieznany, ale wiem, że format .7Z może.
Tak, zgadzam się z tym, nie mogę wymyślić żadnych specjalnie równoległych bibliotek kompresji. Jeśli ktoś miałby go napisać, nie mogę myśleć, jak by to działało, gdyby nie podzielić surowych danych na porcje i kompresować je w wątku. Pamiętaj, że jeśli podzielisz go na zbyt małe kawałki, zmniejszysz wydajność kompresji (zarówno czasu, jak i rozmiaru). –
Dobra wzmianka o SharpZipLib, właściwie już go używam. Jeśli chodzi o dzielenie strumienia, tak, jestem świadomy tego rozwiązania, niestety wymaganie to skompresowanie pojedynczego strumienia, który jest podawany do mojego kodu i zapisanie do pojedynczego skompresowanego strumienia, więc dzielenie przychodzących danych nie jest tak naprawdę opcja. – Gareth
Wygląda na to, że szukasz bardzo drobnoziarnistego gwintowania lub "mikro-równoległości", jeśli chcesz. Jeśli masz czas, możesz znaleźć sposób modyfikacji podprogramów #ZipLib w celu użycia równoległych pętli, takich jak te znalezione w Parallel.NET (lub jakkolwiek to się nazywa). –