Secondo me ti conviene fare una funzione che ti restituisce una matrice parziale. cioè, al posto di fare una matrice che contiene tutto, restituisci una matrice di (per esempio) 20 righe, che l'utente può visionare. Se l'utente vuole visionare le successive 20 righe, clicca un tasto (o quello che preferisci) e la funzione restituisce le 20 righe successive.

Per farti capire meglio:
Se ho 100 righe, posso visualizzarne 20 alla volta e mettere un tasto avanti e indietro che, ad ogni click mi ricarica la lista con le 20 righe successive o precedenti. In questo modo il tutto diventa più leggero e non ti carichi milioni di righe in memoria.

Questa potrebbe essere una soluzione, che va bene se devi solo visualizzare i dati, se devi farci operazioni o altro il tutto diventa più complesso ma il principio rimane lo stesso...