Sto lavorando con un database mysql piuttosto grande (diverse milioni di righe) con una colonna che memorizza le immagini BLOB. L'applicazione tenta di catturare un sottoinsieme delle immagini e su di esse esegue alcuni algoritmi di elaborazione. Il problema che sto incontrando è che, a causa del set di dati piuttosto grande che ho, il set di dati restituito dalla mia query è troppo grande per essere archiviato in memoria.Gestione di un enorme set di risultati SQL
Per il momento, ho modificato la query per non restituire le immagini. Durante l'iterazione sul set di risultati, eseguo un'altra selezione che cattura l'immagine individuale correlata al record corrente. Funziona, ma le decine di migliaia di query aggiuntive hanno comportato una riduzione delle prestazioni inaccettabile.
La mia prossima idea è di limitare la query originale a 10.000 risultati o così, e quindi continuare a interrogare su spanne di 10.000 righe. Questo sembra compromettere il mezzo della strada tra i due approcci. Sento che probabilmente c'è una soluzione migliore di cui non sono a conoscenza. C'è un altro modo per avere solo porzioni di un gigantesco set di risultati in memoria alla volta?
Cheers,
Dave McClelland
Forse i problemi di memoria non sono causati dalla query. Sono tornato a una versione precedente (grazie, controllo della versione), e il datareader sembra caricare solo la riga che sta leggendo, come citato da Anthony. Ancora, mi chiedo se non abbia più senso conservare le immagini sul filesystem locale invece di trasferirle sulla rete dal server DB (come menzionato da ProphetBeal sotto). Lo svantaggio è che sarebbe memorizzato in entrambe le posizioni (devono rimanere nel DB per l'uso di altri sistemi), ma lo spazio di archiviazione del filesystem non è un problema immediato. Qualche idea su questo? –
Sto dando la risposta ad Anthony perché ha sottolineato che il DataReader non è il motivo per cui la mia memoria si stava riempiendo (era qualcosa di correlato, ma leggermente diverso). Probabilmente userò la soluzione di ProphetBeal per mantenere i BLOB sul computer locale per eliminare la congestione della rete, ma per chiunque abbia a che fare con un set di dati di grandi dimensioni da archiviare sul computer locale, un DataReader dovrebbe essere una soluzione efficace. –