2015-09-15 25 views
8

Sto tentando di simulare l'utilizzo dei panda per accedere a un file in costante cambiamento.Streaming dei dati per i panda df

Ho un file che legge un file csv, aggiungendo una riga e poi dormendo per un tempo casuale per simulare l'input di massa.

import pandas as pd 
from time import sleep 
import random 

df2 = pd.DataFrame(data = [['test','trial']], index=None) 

while True: 
    df = pd.read_csv('data.csv', header=None) 
    df.append(df2) 
    df.to_csv('data.csv', index=False) 
    sleep(random.uniform(0.025,0.3)) 

Il secondo file è il controllo per la modifica dei dati emettendo la forma del dataframe:

import pandas as pd 

while True: 
    df = pd.read_csv('data.csv', header=None, names=['Name','DATE']) 
    print(df.shape) 

Il problema è che, mentre sto ottenendo la giusta forma del DF, ci sono alcune volte in cui è in uscita (0x2).

cioè .:

... 
(10x2) 
(10x2) 
... 
(10x2) 
(0x2) 
(11x2) 
(11x2) 
... 

Questo si verifica ad un certo ma non tra ogni cambiamento di forma (il file aggiungendo dataframe).

Sapendo che ciò accade quando il primo script apre il file per aggiungere dati, e il secondo script non è in grado di accedervi, quindi (0x2), si verificherà una perdita di dati?

Non riesco ad accedere direttamente allo stream, solo al file di output. O ci sono altre possibili soluzioni?

Modifica

Lo scopo di questo è quello di caricare i nuovi dati solo (Ho un codice che lo fa) e fare analisi "on the fly". Alcune delle analisi includeranno output/sec, grafici (simili alla trama del flusso) e pochi altri calcoli numerici.

Il problema più grande è che ho accesso solo al file csv, e devo essere in grado di analizzare i dati così come arrivano senza perdita o ritardo.

+0

Qual è l'obiettivo in sostanza? Qualcosa come il cane da guardia per verificare le modifiche al file potrebbe essere un approccio migliore? –

+1

Si potrebbe anche implementare un blocco in modo che solo un processo possa aprire il file alla volta, unix ha vari modi per farlo http://stackoverflow.com/questions/29520587/checking-running-python-script-within-the- python-script/29522672 # 29522672. avere una lettura del processo e l'altra scrittura probabilmente non ti perderebbe alcun dato, ma se stai usando i dati per verificare le modifiche otterrai un'uscita errata. –

+0

watchdog sembra uno strumento interessante da usare, ma non quello che sto cercando. Ho modificato la mia domanda per spiegare di più. – Leb

risposta

2

Uno degli script sta leggendo il file mentre l'altro sta tentando di scrivere sul file. Entrambi gli script non possono accedere al file nello stesso momento. Come Padraic Cunningham dice nei commenti è possibile implementare un file di blocco per risolvere questo problema.

C'è un pacchetto Python che farà proprio quello chiamato lockfile con la documentazione here.

Ecco il vostro primo script con il pacchetto file di lock implementato:

import pandas as pd 
from time import sleep 
import random 
from lockfile import FileLock 

df2 = pd.DataFrame(data = [['test','trial']], index=None) 
lock = FileLock('data.lock') 

while True: 
    with lock: 
     df = pd.read_csv('data.csv', header=None) 
     df.append(df2) 
     df.to_csv('data.csv', index=False) 
    sleep(random.uniform(0.025,0.3)) 

Qui è secondo script con il pacchetto file di lock implementato:

import pandas as pd 
from time import sleep 
from lockfile import FileLock 

lock = FileLock('data.lock') 

while True: 
    with lock: 
     df = pd.read_csv('data.csv', header=None, names=['Name','DATE']) 
    print(df.shape) 
    sleep(0.100) 

ho aggiunto un'attesa di 100 ms in modo che potessi rallenta l'output sulla console.

Questi script creeranno un file denominato "data.lock" prima di accedere al file "data.csv" ed eliminare il file "data.lock" dopo aver effettuato l'accesso al file "data.csv". In entrambi gli script, se esiste "data.lock", lo script attenderà fino a quando il file "data.lock" non esisterà più.

+0

Questo non funzionerà perché il primo script è una simulazione del file che viene costantemente aggiornato. In realtà posso solo modificare/modificare il secondo script in cui sto solo leggendo il file – Leb

1

Lo script di simulazione legge e scrive nel file data.csv.È possibile leggere e scrivere contemporaneamente se uno script apre il file solo come scrittura e l'altro apre il file in sola lettura.

Con questo in mente, ho cambiato lo script di simulazione per la scrittura del file nella seguente:

from time import sleep 
import random 

while(True): 
    with open("data.csv", 'a') as fp: 
     fp.write(','.join(['0','1'])) 
     fp.write('\n') 
    sleep(0.010) 

In Python, l'apertura di un file con 'a' mezzo aggiungono come solo scrittura. Usando 'a +' si aggiungerà l'accesso in lettura e scrittura. È necessario assicurarsi che il codice che scrive il file aprirà il file solo come di sola scrittura e che lo script che sta leggendo il file non deve mai tentare di scrivere sul file. In caso contrario, sarà necessario implementare un'altra soluzione.

Ora dovresti essere in grado di leggere utilizzando il tuo secondo script senza il problema che menzioni.