Opzioni di analisi dei dati fuori core


18

Uso SAS da quasi 5 anni. L'ho installato sul mio laptop e spesso devo analizzare set di dati con 1.000-2.000 variabili e centinaia di migliaia di osservazioni.

Ho cercato alternative a SAS che mi permettessero di condurre analisi su set di dati di dimensioni simili. Sono curioso di sapere cosa usano gli altri per situazioni come questa. Questo non è certamente "Big Data" nel modo in cui viene utilizzato oggi. Né i miei set di dati sono abbastanza piccoli da contenere in memoria. Ho bisogno di una soluzione in grado di applicare algoritmi ai dati memorizzati su un disco rigido. Queste sono le cose che ho studiato senza risultati:

  1. R - BigMemory può creare matrici archiviate in memoria, ma gli elementi devono essere nella stessa modalità. Lavoro con dati che sono quasi una divisione del 50/50 tra carattere e numero. Il pacchetto FF si avvicina a ciò di cui ho bisogno, ma non capisco bene quali procedure siano compatibili con esso. Penso che il supporto sia piuttosto limitato.
  2. Panda - Ero molto entusiasta di un'alternativa Pythonic a R. Tuttavia, anche questo deve contenere tutti i dati in memoria.
  3. Rivoluzione R - Questo mostra un bel po 'di promessa. Ne ho una copia sul mio computer di casa (gratuita se ti iscrivi a Kaggle) e devo ancora testarlo come valida alternativa a SAS. I commenti su Revolution R come alternativa SAS sono molto apprezzati.

Grazie

AGGIORNAMENTO 1

Editing per aggiungere che sto cercando soluzioni pratiche e reali che le persone hanno usato con successo. Per la maggior parte, SAS mi consente di esaminare i file di grandi dimensioni senza preoccuparmi un po 'dei vincoli di memoria. Comunque sia implementato SAS, hanno capito come rendere la gestione della memoria trasparente per l'utente. Ma è con il cuore pesante che ho usato SAS per il mio lavoro (devo) e ADORO un'alternativa FOSS che mi consente di lavorare su dati "di grandi dimensioni" senza dover pensare troppo a dove si trovano i dati in un orario specifico (in memoria o su disco).

Le cose più vicine che ho incontrato sono il pacchetto FF di R e qualcosa all'orizzonte per Python chiamato Blaze . Eppure, questi problemi esistono da molti anni, quindi cosa hanno fatto gli analisti nel frattempo? Come gestiscono questi stessi problemi con i limiti di memoria? La maggior parte delle soluzioni in offerta sembra essere:

  • Ottieni più RAM - Questa non è una buona soluzione, imo. È facile trovare un set di dati che può superare la RAM ma che si adatta comunque a un disco rigido. Inoltre, il flusso di lavoro deve accogliere tutte le strutture create durante l'analisi dei dati esplorativi.
  • Sottoinsieme dei dati: va bene per l'esplorazione ma non per finalizzare risultati e rapporti. Alla fine, tutti i processi sviluppati su un sottoinsieme dovranno essere applicati all'intero set di dati (nel mio caso, comunque).
  • Sfogliare i dati: questo è ciò di cui vorrei sapere di più dalle persone che implementano effettivamente questo flusso di lavoro. Com'è fatto? Con quali strumenti? Può essere fatto in modo trasparente per l'utente? (ad esempio, creare una struttura di dati su disco e il frame-work si occupa del blocco sotto il cofano).

1
Le versioni più recenti di Stata su macchine a 64 bit non hanno problemi con set di dati di queste dimensioni (perché al giorno d'oggi 5 GB si adattano facilmente alla RAM) ma ti interessano le alternative commerciali a SAS o stai solo guardando FOSS?
whuber

1
Sì, le soluzioni FOSS sono ciò che sto cercando. Concordo sul fatto che un set di dati potrebbe adattarsi a 5 concerti di RAM, ma deve anche gestire le operazioni e le strutture di dati aggiuntive create durante l'analisi dei dati esplorativi. Abbinalo a laptop commerciali dotati di un magro 4 GB di RAM e l'overhead consumato dal sistema operativo e gli errori di memoria si presentano abbastanza rapidamente.
Zelazny7,

2
@ Zelazny7: L'aggiunta di altri 4Gig a un laptop dovrebbe essere abbastanza economica in questi giorni. :)
curious_cat il

3
Un'altra opzione è quella di archiviare i dati in un database (SQL o altro). Spesso un'analisi richiederà solo un sottoinsieme di dati (variabili 1:10, ma non 1: 1000) che si adatteranno alla memoria. Se il sottoinsieme è ancora più grande della memoria, l'analisi può essere eseguita in blocchi (caricare i dati dal database 1000 osservazioni alla volta, raccogliere i risultati in modo appropriato alla fine).
jthetzel,

1
Assicurati di rivedere le domande sui big data su SO, nonché la visualizzazione delle attività di elaborazione ad alte prestazioni su CRAN per ulteriori discussioni correlate, se non l'hai già fatto.
jthetzel,

Risposte:


3

se stai raggiungendo il limite massimo di 500.000 record x 2.000 variabili, spenderei un po 'più di denaro in RAM per il tuo laptop e finirò con esso. se hai 16 GB, puoi probabilmente leggere direttamente il set di dati che stai descrivendo in R. e a quel punto, sarai in grado di fare molto di più - e molto rapidamente .. ma dici che non è un'opzione, quindi:

guarda i pacchetti basati su SQL per R. questi ti permettono di connetterti a database esterni e accedere a quelle tabelle tramite SQL. poiché SQL è piuttosto universale (e poiché R è open-source), il codice non andrà perso se cambi lavoro o perdi l'accesso a SAS. il database esterno più semplice da configurare è RSQLitema di gran lunga il più veloce è MonetDB.R( test di velocità )

probabilmente ci sono alcune buone soluzioni al tuo problema dichiarato, la mia ipotesi è che quasi tutte coinvolgono R;)


2

Forse non si tratta tanto delle applicazioni / dei problemi a cui stai mirando e delle sue caratteristiche, ma piuttosto degli algoritmi e delle varianti che stai utilizzando. Più concretamente, al fine di gestire i big data, sono comparse molte varianti basate sulla discesa stocastica del gradiente di algoritmi popolari, come SVM, che sono in grado di gestirlo.

Scikit offre supporto per alcuni di questi algoritmi (SVM, kNN, kmean, ...). Immagino che questo bel grafico possa aiutarti a capire rapidamente se scikit ha senso per te.

Spero possa aiutare

NOTA: ciò che segue è una risposta al commento di zelazny7

Ora ti ho capito. Quello che stai cercando sono i panda . Dai un'occhiata alla sezione dei discorsi. C'è una presentazione che confronta brevemente il flusso di lavoro di Panda e quello di Panda. Panda consente di importare dati in diversi formati e gestire i file bgu attraverso l' integrazione delle tabelle HDF5 . Inoltre, puoi interfacciare Scikit.


Grazie! Gli algoritmi dovrebbero sicuramente funzionare on-lineo su blocchi di dati letti in memoria e riscritti su disco. Scikit è fantastico ed è in realtà quello che ADORO usare, ma quali strumenti / flussi di lavoro / approcci esistono per le fasi molto necessarie di esplorazione, munging e preparazione dei dati prima di applicare questi algos? Queste lingue possono gestire questi passaggi, ma sto davvero cercando un esempio reale da qualcuno che deve affrontare questi problemi con la memoria.
Zelazny7,

Ho modificato la mia risposta con quello che stai cercando (o
almeno

2

Ti senti già a tuo agio con SAS e i tuoi set di dati sono abbastanza piccoli da adattarsi alla RAM, ma forse non puoi adattare abbastanza RAM al tuo laptop. Se non ti dispiace restare con SAS, che ne dici di collegarti a SAS in esecuzione in remoto su un computer con molta RAM? Non ho idea di come funzioni, ma questi collegamenti potrebbero iniziare.

Ci sono altri ottimi motivi per usare Pandas o R, ma non penso che devi preoccuparti dei limiti di memoria. Se non riesci a contenere abbastanza memoria sul tuo laptop, esegui l'istanza Python o R altrove e connettiti con SSH, iPython Notebook o RStudio.


1

Graphchi è eccellente e può gestire enormi set di dati. È un po 'una seccatura con cui lavorare, ma può gestire dati grafici e non grafici.


1

Di recente mi sono imbattuto in SFrames e GraphLab Create. Queste sono librerie per Python che offrono il tipo di funzionalità che sembra stia cercando Dal sito Pypi: "SFrame è un frame di dati scalabile e out-of-core, che ti consente di lavorare con set di dati più grandi della quantità di RAM sul tuo sistema ". Quindi pensala come la funzionalità di manipolazione dei dati e l'API in Panda, ma senza prima inserire tutti i dati in memoria. SFrame è gratuito e open source per quanto ne so. D'altra parte GraphLab si basa sulla funzionalità SFrame per fornire algoritmi per eseguire analisi descrittive e predittive (machine learning) sui dati archiviati in SFrame. GraphLab Create create non è gratuito / open source, ma ha una licenza demo gratuita. In ogni caso, a seconda di quanto sofisticati debbano essere i tuoi algoritmi, SFrame potrebbe essere sufficiente per te.


-1

Hai considerato un linguaggio "reale", non interpretato come Fortran?

Sembra che i suggerimenti finora siano o molto dipendenti o interpretati. I metodi interpretati sono notoriamente dannosi per le applicazioni intense di memoria. MatLab potrebbe avere un livello di linguaggio molto più alto rispetto a "C", ma le ottimizzazioni di gestione della memoria in C possono far sì che gestisca insiemi di dati 100 volte più veloci che sono milioni di volte più grandi.

Sia "R" che "Python" sono linguaggi meravigliosi, di alto livello, tecnicamente ricchi e molto usati. Sono anche interpretati.

Potresti considerare una delle istanze di R-on-Hadoop. (Rhipe, altri) Questo ha il vantaggio di poter tradurre R (alto livello, facile da programmare) in istruzioni MapReduce / Hadoop. Hadoop può creare un cluster multiprocessing interessante per i poveri.

http://www.datadr.org/ <- (collegamento Rhipe)

Fortran è stato sviluppato per decenni. Ha una gestione e una compilazione della memoria molto efficienti. Ha anche alcune librerie di livello superiore, quindi può eseguire operazioni tecnicamente molto sofisticate in modo piuttosto semplice. Potrei fare un CFD giocattolo in MatLab, ma per qualcosa di realistico e auto-codificato, userei Fortran per l'elaborazione "big iron" e qualcosa come MatLab o R per presentare / riassumere i dati. Nessuno produce software CFD commerciale il cui "motore" viene interpretato anziché compilato. Diversi venditori hanno il loro CFD Moneymaker codificato in C o Fortran. SAS è stato originariamente scritto in C ( link ).

Fortran e Rhipe sono accessibili. MatLab costa denaro e se il mio lavoro non lo pagasse allora userei R o Python in questo momento.

AGGIORNAMENTO: il
mio punto è stato "compilato". Python ha un cython che può letteralmente eseguire lo stesso codice (fondamentale) ~ 1000 volte più veloce. Ciò significa che puoi avere dati che sono ~ 1000x più grandi ed elaborarli quasi nello stesso momento. Far funzionare Cython in modo pulito può essere una sfida, ma strumenti come " Sage " lo avvolgono bene. Presumibilmente Rcpp ha simili, ma personalmente non so che sia altrettanto sviluppato.

Se ci pensate, i fondamenti di quasi tutto ciò che gestite nell'informatica scientifica, anche nei linguaggi interpretati, è compilato Fortran o compilato C. BLAS è BLAS; non stai reinventando il codice ogni volta che fai EDA . Il tuo linguaggio interpretato chiama quelle librerie, anche se in modo molto inefficiente, quando viene eseguito.

A parte, potresti guardare JMP . Ha un'interfaccia molto facile da usare ed è eccellente per l'analisi dei dati esplorativi molto visivi ( EDA ).


2
Come esplori i dati con un linguaggio compilato come fortran? Il fascino delle lingue interpretate, per me, è il REPL che fornisce una ricca introspezione e mi permette di imparare rapidamente con cosa ho a che fare e di giocare con le nuove funzioni di libreria che non conosco.
Zelazny7,

1
Rcpp è molto ben sviluppato (basta controllare l'utilizzo inverso su CRAN), ma non è davvero paragonabile a cython. Se hai una funzione definita, sì, puoi prendere l'input R, elaborarlo in Cpp e restituire i dati a R. Ma presto non compilerai un intero script R in Cpp.
russellpierce
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.