2012-12-22 21 views
7

Ho un database Oracle dove sono archiviate grandi quantità di dati biometrici come HRV ed ECG. Devo mostrare questi dati per ogni utente in foglio Excel. Ma questi dati sono così grandi, anche per un singolo utente stiamo ottenendo più di 1.00.000 record. Ci sono attualmente 100 ~ utenti.Utilizzo di php per scrivere grandi quantità di dati su Excel senza errore limite di memoria

Quello che sto facendo è:

  1. eseguo un job cron utilizzando riga di comando per la stessa, che ho sviluppato in Zend Framework.
  2. Mi assicuro che questo CRON non si sovrapponga.
  3. Ricevo tutti i dati dal database di Oracle per ciascun utente uno per uno, quindi lo memorizzo in un array.
  4. Quando ottengo i dati per tutti gli utenti, utilizzo la libreria phpexcel per generare un foglio Excel.

    Struttura del foglio di Excel

    • uid 1/uid/2 uid/3 ----------- ennesima
    • dati | dati | dati |
    • dati | dati | dati |
    • |
    • ennesima

Problema:

PHP richiede 1,5 GB di RAM e memorizza i dati nella matrice e inviarlo alle funzioni per interagire con phpexcel ma questa libreria richiede 3-4 ore e poi ho l'errore "Fatal: limite di memoria". Il mio sistema ha solo 2 GB di RAM.

Quali passi dovrei fare per ottimizzare il mio codice per gestire i dati di queste dimensioni e visualizzare le stesse informazioni in formato excel o ho bisogno di aumentare la RAM?

+0

Che cosa faranno i tuoi utenti con così tanti dati in Excel? –

+0

Questi utenti sono fondamentalmente ricercatori. Quindi potrebbero usare questi dati in MATLAB o potrebbero usarlo per creare algoritmi migliori. Ci sono tante possibilità. Fondamentalmente la mia domanda riguardava la ricerca di un modo ottimizzato per gestire questo tipo di scenario. – techgyani

risposta

7

Considerare l'utilizzo di PHP solo per estrarre una sorta di file delimitato da lettura Excel (CSV) contenente i dati dei risultati. (L'idea è che non si scriverà in Excel tramite PHP, a causa dei limiti che si stanno verificando).

È possibile richiedere che il file generato da php tramite qualcosa come Powershell e quindi Powershell o altra scelta di script apra il file csv direttamente in Excel e quindi salvi come xlsx.

Oppure si potrebbe fare in modo che la propria riga di comando php effettui una chiamata di "sistema" ed esegua il passaggio di script che apre il csv direttamente in Excel e quindi lo salva come xlsx.

+0

Hai ragione a memorizzare questi dati in CSV sarà molto meglio. Ma supponiamo che la dimensione di questo file diventi 1 GB mentre php stava scrivendo su di esso.Quindi quanta RAM ci vorrà, voglio dire che non causerà errori di memoria? Quando apriamo un file da 1 GB in un blocco note, vediamo che viene impiccato, php è ottimizzato per farlo? – techgyani

+1

PHP non deve avere tutti i dati in memoria allo stesso tempo per scrivere il file. È possibile che una query Oracle restituisca 1000 righe di dati alla volta per tutti i 100 utenti, non solo per un utente. Scrivi 1000 righe alla volta nel file. Quindi ottieni le prossime 1000 righe tramite Oracle. Aggiungi le prossime 1000 righe, ecc. (Puoi sperimentare il numero di righe che funziona meglio in termini di velocità rispetto al consumo di memoria). – DWright

+0

Bel suggerimento, ma una cosa che dimentico di menzionare è che ho bisogno di usare più fogli in un documento Excel come i dati HRV di tutti gli utenti nel foglio singolo e la frequenza respiratoria in un altro foglio e ho qui dei server Linux. Quindi la conversione CSV in XLS funziona o ho bisogno di adottare lo stesso approccio per i file XLS. – techgyani

1

Se i dati di un singolo utente sono enormi, si utilizza così tanta memoria per conservare questi dati, provare a scriverlo in Excel in modalità batch. Salverà l'utilizzo della memoria.

Problemi correlati