Google App-Engine Java Batch Update
-
27-09-2019 - |
Вопрос
Мне нужно загрузить файл .csv и сохранить записи в bigtable. Мое приложение успешно проанализирует 200 записей в файлах CSV и сохранить в таблицу.
Вот мой код, чтобы сохранить данные.
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();
}
}
}
}
Но когда никакие записи не растут, дает ошибку времени ожидания.
Файл CSV может иметь до 800 записей. Можно ли сделать это в приложении?
(что-то вроде пакетного обновления)
Решение
GAE Ограничьте запрос приложения до 30 секунд, и вы не можете запустить длинную задачу.
Лучший подход - это разделить этот CSV на мелкие куски и обрабатывать их индивидуально, один после одного. В случае, когда вы можете загрузить его только в виде одного большого файла, вы можете хранить его как двоичные данные, а затем процесс (разделение и анализа), используя Очередь задачи (Обратите внимание, что он также ограничен 10 минут на запрос, но вы всегда можете сделать цепочку задач). Или вы можете перезапустить пользователь к обработке.
Другие советы
Вы можете хранить свой файл CSV в BlobStore (избрал или нет) и используйте MapReduce Wain. Читать и сохранить каждую строку в хранилище данных.