2016-02-01 8 views
6

bramkizmienić konkretne indeksy w ciągu do tej samej wartości pytona

Reading w masywnej plik binarny Orientacyjna wielkość 1.3GB i zmienić pewne fragmenty, a następnie pisanie go z powrotem do osobnego pliku (Nie można modyfikować oryginalnego pliku).

Metoda

Kiedy czytam w pliku binarnego robi przechowywane w masywnej ciąg zakodowany w formacie szesnastkowym, który jest niezmienny, ponieważ używam Pythona.

Mój algorytm wykonuje pętle przez cały plik i zapisuje na liście wszystkie indeksy łańcucha, które należy zmodyfikować. Połów jest taki, że wszystkie indeksy w ciągu muszą zostać zmodyfikowane do tej samej wartości. Nie mogę tego zrobić w miejscu ze względu na niezmienny charakter. Nie mogę przekształcić tego w listę znaków, ponieważ to wysadza moje ograniczenia pamięci i zajmuje dużo czasu. Sprawą godną uwagi jest przechowywanie go w osobnym łańcuchu, ale ze względu na niezmienny charakter muszę stworzyć mnóstwo obiektów smyczkowych i dalej się z nimi łączyć.

Użyłem niektórych pomysłów z https://waymoot.org/home/python_string/, ale nie daje mi to dobrego wykonania. Jakieś pomysły, celem jest skopiowanie istniejącego super długiego łańcucha dokładnie do innego, z wyjątkiem pewnych symboli zastępczych określonych przez wartości z Listy indeksów?

+0

Zamienniki są tego samego rozmiaru co oryginał? Mogę więc wyszukać pozycję pliku i zapisać na dysku. –

+0

Mówisz "zapisywanie go", ale w komentarzu do mojej odpowiedzi powiedz "ograniczenie to nie zmieniać oryginalnego pliku". To sprzeczność. –

+0

edytowane pytanie- przepraszam za niejednoznaczność –

Odpowiedz

5

Szczerze mówiąc, nie powinieneś czytać swojego pliku w ciągu znaków. Nie powinieneś szczególnie pisać niczego poza bajtami, które faktycznie zmieniasz. To tylko marnowanie zasobów, ponieważ wydaje się, że czytasz liniowo w pliku, zwracając uwagę na miejsca, które wymagają modyfikacji.

We wszystkich systemach operacyjnych z pewnym poziomem obsługi mmap (tj. Unix, w tym Linux, OS X, * BSD i innych systemów, takich jak Windows), można użyć modułu Python's mmap, aby otworzyć plik w trybie odczytu/zapisu , zeskanuj go i edytuj w miejscu, bez konieczności całkowitego załadowania go do pamięci RAM, a następnie zapisz go z powrotem. Głupi przykład, konwersja wszystkich bajtów o wartości 12 przez coś zależnego od pozycji:

Uwaga: ten kod jest mój, a nie licencjonowany na MIT. Ma na celu poprawę jakości tekstu i tym samym jest objęty CC-by-SA. Dziękuję SE za uczynienie tego głupiego oświadczenia koniecznym.

import mmap 
with open("infilename", "r") as in_f: 
    in_view = mmap.mmap(in_f.fileno(), 0) ##length = 0: complete file mapping 
    length = in_view.size() 
    with open("outfilename", "w") as out_f 
    out_view = mmap.mmap(out_f.fileno(), length) 
    for i in range(length): 
     if in_view[i] == 12: 
     out_view[i] = in_view[i] + i % 10 
     else: 
     out_view[i] = in_view[i] 
+0

To brzmi jak dobre rozwiązanie, jednak ograniczeniem jest to, że nie mogę zmodyfikować pliku wejściowego, muszę zapisać go w osobnym formacie pliku, który będzie łączył się z innym procesem. Więc zmiana w pamięci nie zrobi mi dobrze. Również niektóre pliki wejściowe są tylko do odczytu i nie mam nawet uprawnień do mmap, żadnych innych sugestii? –

+0

nadal możesz zminimalizować je tylko do odczytu i skopiować zawartość do drugiego, zapisanego w mm pliku. Tak bym zrobił. –

+0

@johnsmith zaktualizowany, aby odzwierciedlić ten pomysł –

0

A co z krojeniem sznurka, modyfikowaniem każdego plasterka, zapisaniem go na dysku przed przejściem do następnego plasterka? Zbyt intensywny na dysku?

+0

Naprawdę wypróbuję to, moje nieodłączne założenie, że będzie na dysku spowolni program drastycznie. Ale może być interesujące zobaczyć faktyczną kompromitację wydajności. –

+0

Zazwyczaj odpowiedzi zawierają kilka dodatkowych informacji, takich jak przykłady kodu, ... – Trilarion

+0

Tak, chcę zostawić komentarz, aby rozpocząć dyskusję, ale nie mam wystarczającej reputacji ... – Benares

Powiązane problemy