2010-07-09 4 views
5

Я экспериментирую с GAE за последние 2 месяца.Насколько быстро Google App Engine?

Я сохраняю записи на большой стол, загружая CSV-файл.

Размер моего тестового файла - 300 КБ.

Вот что я нашел

Локальная система

  • Загрузить принять менее чем за 1 секунду
  • Обрабатывать 2500 записей в течение 3 секунд

На Google Sandbox

  • Загрузка занимает 5-7 секунд.

  • Файл обработки дает время ожидания.

  • Он сохраняет только 60-180 записей.

Мои вопросы

  1. Почему это занимает слишком много времени?
  2. Есть ли способ уменьшить это время?
  3. Google учитывает эту обработку для использования ЦП. Они не раскрывают h/w так, какой процессор они используют внутри страны? Я имею в виду, что я получаю центральный процессор или больше, чем PIII?

Edited для @Drew Sears «ы ответ.

Что я делаю в настоящее время

  1. Загрузить файл в GAE
  2. Получить загруженные байты данных. По потоку, подсчитайте строки, сохраните их в большой таблице.
  3. Существует уникальное поле, id, моя запись.
  4. Теперь я создать очередь

ИНТ х = linesCount/50;

for(int i<0;i=x;i++) 
{ 
     x = i * 50; 
     Queue queue = QueueFactory.getQueue("test-queue"); 
     queue.add(TaskOptions.Builder.url("/TestQueue") 
       .param("id", id.toString()) 
       .param("startIdx",String.valueOf(x)) 
       .param("totRec",String.valueOf(50)) 
     ); 
    } 

int y = linesCount % 50; 
if(y > 0) 
{ 
    x = (linesCount/50) * 50; 
    Queue queue = QueueFactory.getQueue("test-queue"); 
    queue.add(TaskOptions.Builder.url("/TestQueue") 
      .param("id", id.toString()) 
      .param("startIdx",String.valueOf(x)) 
      .param("totRec",String.valueOf(y)) 
    );      
} 

Обработка задач сервлет чтения файла из хранилища и использованием totRec и startIdx обработать файл и закройте его ..

+0

Действительно ли время, которое вы испытываете в песочнице Google по первому запросу? Как насчет последующих запросов? – naikus

+0

Задержка, которую вы испытываете, не вызвана отсутствием мощности ЦП, а путем внедрения хранилища данных GAE (и вашего сетевого соединения). GAE разделяет ресурсы с другими приложениями на тех же серверах, но у них есть много циклов процессора, чтобы обойти ... Это хранилище данных, которое отстает. – 2010-07-09 11:15:20

+0

В первом запросе он сохраняет только 60 rceords. Следующий запрос улучшает скорость и сохраняет 120-150 записей. теперь максимум доходит до 184 записей – Manjoor

ответ

4

Это действительно не лучший способ, чтобы проверить масштабируемость App Engine.

  1. Если у вас есть 7 секунд для публикации 300 КБ, узким местом почти наверняка будет ваша пропускная способность по восходящему потоку, а не пропускная способность нисходящего канала Google или что-то еще, что связано с App Engine.Я регулярно получаю намного более быструю скорость загрузки.
  2. Если вы хотите, чтобы запросы заканчивались быстрее, минимизируйте ваши вызовы RPC. Каждый datastore get, put или query - это круговое путешествие на внешний сервер. Если вы зацикливаете сотни строк и делаете внутри каждой итерации цикла, вы получаете огромное количество ненужных накладных расходов. Сохраните все свои объекты, используя один набор данных, и вы получите гораздо более быстрые результаты. Guido's AppStats framework - отличный инструмент для поиска возможностей оптимизации RPC.
+1

+1 для упоминания опасностей о выполнении отдельной строки() для каждой строки –

+0

Я могу свести к минимуму запрос RPC, но как я могу уменьшить запрос хранилища данных? Мне нужно сохранить записи 3k, которые нуждаются в вызове базы данных 3k (или makePersistant() в моей ситуации). Есть ли метод массового сохранения? s – Manjoor

+0

То же самое. Каждый запрос хранилища данных является вызовом RPC. Да, хранилище данных позволяет хранить несколько объектов в одном вызове. В Python это просто db.put() со списком сущностей; Я не знаю, какой синтаксис будет в Java. –