Quindi ho bisogno di registrare un set di 4 numeri interi i cui valori sono diversi per ogni secondo del giorno. cioè .:Modifica di una singola riga in un file di testo di grandi dimensioni
#Here the values are initialized to the same value, however they will change as samples are taken
data = [[.25 for numData in range(4)] for numSecs in range(86400)]
Ora, ovviamente una matrice bidimensionale (gah sua pitone, LIST) il cui primo indice di lunghezza è 86400 è assolutamente impossibile. Invece voglio creare un file di testo con 86.400 righe formattate come ad esempio:
numSec data0 data1 data2 data3
0 .25 .25 .25 .25
1 .25 .25 .25 .25
2 .25 .25 .25 .25
...
E come vengono prelevati campioni, voglio essere in grado di modificare questo file, anzi, voglio essere in grado di modificare la linea di il file il cui numSec = il secondo il campione è stato preso. Ad esempio, un campione prelevato a numSec = 2 (2 secondi dopo la mezzanotte) potrebbero causare il mio programma per modificare il file in modo che:
0 .25 .25 .25 .25
1 .25 .25 .25 .25
2 .70 .10 .10 .10
...
sembra abbastanza facile, ho anche letto un sacco di posti che hanno dimostrato come riscrivi un singolo in un file di testo. Il problema è che richiedono tutti di leggere l'intero file. Non voglio che il mio programma stia leggendo 86.400 linee al secondo.
Così arriviamo alla mia domanda: Posso leggere una singola riga in un file di testo, modificarla e scriverla di nuovo nel file, senza leggere l'intero file ogni volta che è necessario apportare una modifica?
P.S. Devo notare che sto usando Ubuntu 12.04 (Precise) e questo è per l'uso in un nodo ROS
PPS Questo programma verrà eseguito per un numero arbitrario di giorni in modo che ogni "secondo" di dati possa essere letto e riscritto molte volte . Un'altra ragione per cui vorrei usare un file è se il sistema deve essere spento, vorrei salvare le distribuzioni per la prossima volta che viene eseguito.
Se ogni voce nel file ha una lunghezza fissa, forse 'mmap'. Altrimenti, considera il database. – Jokester
Se ciascuna voce ha una lunghezza fissa, si può semplicemente aprire il file in modalità binaria, calcolare l'offset, 'seek' e' write' in posizione.(Funzionerà anche in modalità testo, purché si tenga conto delle nuove righe e delle larghezze del char, ma è tecnicamente illegale.) Tuttavia, 'mmap' sarà probabilmente più semplice, quindi da +1 a jokester. – abarnert
Cosa ti fa pensare che la memorizzazione di 86400 serie di 5 numeri è un problema? In ogni caso, è necessario scrivere, in media, metà del file ogni secondo. Inoltre, ogni secondo avrà a che fare con la linea immediatamente successiva alla riga precedente - perché non tenere tutto in memoria? – Neil