2016-02-01 16 views
6

Calciocambiare indici specifici stringa stesso pitone valore

lettura in una massiccia binario formato di file 1,3 GB circa e cambiare alcuni bit e quindi scrivere indietro in un file separato (non può modificare file originale).

Metodo

Quando ho letto nel file binario che viene memorizzato in una stringa massiccia codificato in formato esadecimale che è immutabile da quando sto usando pitone.

Il mio algoritmo scorre l'intero file e memorizza in un elenco tutti gli indici della stringa che devono essere modificati. Il problema è che tutti gli indici nella stringa devono essere modificati allo stesso valore. Non posso farlo sul posto a causa della natura immutabile. Non riesco a convertirlo in una lista di caratteri perché questo fa esplodere i miei vincoli di memoria e richiede molto tempo. La cosa da fare è memorizzarla in una stringa separata, ma a causa della natura immutabile devo creare una tonnellata di oggetti stringa e continuare a concatenarli.

Ho usato alcune idee da https://waymoot.org/home/python_string/ tuttavia non mi dà una buona prestazione. Qualche idea, l'obiettivo è copiare esattamente una stringa super lunga esistente in un altro tranne per determinati segnaposti determinati dai valori nella lista dell'indice?

+0

Le sostituzioni hanno le stesse dimensioni dell'originale? Così puoi cercare la posizione del file e scrivere sul disco. –

+0

Si dice "riscrivendolo", ma nel commento alla mia risposta si dice "il vincolo è di non modificare il file originale". Questa è una contraddizione. –

+0

domanda modificata- scusa per l'ambiguità –

risposta

5

Quindi, per essere onesti, non dovresti leggere il tuo file in una stringa. Non dovresti scrivere in particolare niente ma i byte che effettivamente cambierai. Questo è solo uno spreco di risorse, dal momento che sembra che tu stia leggendo linearmente attraverso il file, annotando i punti in basso che devono essere modificati.

Su tutti i sistemi operativi con un certo livello di supporto mmap (ovvero Unix, tra cui Linux, OS X, * BSD e altri sistemi operativi come Windows), è possibile utilizzare il modulo Python's mmap per aprire il file in modalità lettura/scrittura , analizzalo e modificalo sul posto, senza la necessità di caricarlo completamente nella RAM e poi riscriverlo. Esempio stupido, conversione di tutti i byte con 12 valori in base alla posizione:

Nota: questo codice è mio e non è concesso al MIT. È destinato agli scopi di miglioramento del testo e quindi coperto da CC-by-SA. Grazie SE per aver reso necessaria questa stupida affermazione.

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

Questa sembra una buona soluzione, tuttavia il il vincolo è che non posso modificare il file di input, ho bisogno di scriverlo in un formato di file separato che collegherà in un altro processo. Quindi cambiarlo in memoria non mi farà bene. Anche alcuni dei file di input sono di sola lettura e non ho nemmeno il permesso di mmapli, altri suggerimenti? –

+0

è ancora possibile visualizzarli in lettura e copiare il contenuto in un secondo file writeapix in mmap. Questo è quello che farei. –

+0

@johnsmith aggiornato per riflettere questa idea –

0

Che dire di affettare la stringa, modificare ogni slice, scriverlo sul disco prima di passare alla slice successiva? Troppo intensivo per il disco?

+0

Veramente provarlo, la mia supposizione inerente a ciò che sta per disco rallenterà drasticamente il programma. Ma potrebbe essere interessante vedere l'effettivo compromesso in termini di prestazioni. –

+0

In genere una risposta contiene alcuni altri dettagli come esempi di codice, ... – Trilarion

+0

Sì, volevo lasciare un commento per iniziare la discussione ma non ho abbastanza reputazione ... – Benares

Problemi correlati