Aggiornamento batch Google App Engine-Java
-
27-09-2019 - |
Domanda
Ho bisogno di caricare un file .csv e salvare i record in bigtable. La mia applicazione analizzare correttamente 200 record nei file CSV e risparmi al tavolo.
Ecco il mio codice per salvare i dati.
for (int i=0;i<lines.length -1;i++) //lines hold total records in csv file
{
String line = lines[i];
//The record have 3 columns integer,integer,Text
if(line.length() > 15)
{
int n = line.indexOf(",");
if (n>0)
{
int ID = lInteger.parseInt(ine.substring(0,n));
int n1 = line.indexOf(",", n + 2);
if(n1 > n)
{
int Col1 = Integer.parseInt(line.substring(n + 1, n1));
String Col2 = line.substring(n1 + 1);
myTable uu = new myTable();
uu.setId(ID);
uu.setCol1(MobNo);
Text t = new Text(Col2);
uu.setCol2(t);
PersistenceManager pm = PMF.get().getPersistenceManager();
pm.makePersistent(uu);
pm.close();
}
}
}
}
Ma quando nessuno di record crescere dà errore di timeout.
Il file CSV può avere fino a 800 record. E 'possibile farlo in App-Engine?
(si parla di aggiornamento batch)
Soluzione
GAE limite si app richiesta di 30 sec, e non è possibile eseguire lungo lavoro.
migliore approccio è quello di dividere questo CSV in blocchi più piccoli, ed elaborarli singolarmente, uno dopo l'altro. Nel caso in cui è possibile caricare solo come un unico grande file, è possibile memorizzare come dati binari, e poi di processo (split e analizzare) utilizzando Task Queue (nota che è anche limitata a 10 minuti per richiesta, ma si può sempre fare una catena di operazioni). Oppure si può backend all'utente di processo.
Altri suggerimenti
Si potrebbe memorizzare il file CSV nel blobstore ( gzip non ) e utilizzare un MapReduce lavoro di leggere e persistono ogni riga nel Datastore