Процессорное время необходимо для массовой загрузки базы данных объемом 2 ГБ?

Я нанял программиста для переноса моего веб-сайта, изначально реализованного с использованием Django и MySQL, на Google App Engine. Размер базы данных исходного веб-приложения составляет около 2 ГБ, а самая большая таблица содержит 5 миллионов строк. Чтобы перенести это содержимое, как я понимаю, программист сериализует базу данных в JSON, а затем загружает ее в движок приложений Google.
Пока что на его загрузку было потрачено 100 часов процессорного времени, как указано GAE, но похоже, что в базу данных загружено только около 50 или 100 МБ. Это разумное количество процессорного времени для такого небольшого количества данных? MySQL может загрузить такой объем данных за несколько минут, поэтому я не понимаю, почему GAE будет в 1000 раз медленнее. Он что-то делает неэффективно?


person Jeff    schedule 14.07.2011    source источник
comment
Не забывайте, что информационная панель довольно запаздывает с сообщением о состоянии хранилища данных. Упомяните вашему разработчику, что если он putting каждую строку / объект по отдельности, он должен рассмотреть возможность объединения puts вместе, чтобы сэкономить ЦП и другие ресурсы.   -  person Chris Farmiloe    schedule 14.07.2011
comment
Это больше зависит от количества строк, чем от фактического размера данных. Поскольку GAE использует процессорное время для каждого Put() вызова.   -  person Roman Dolgiy    schedule 15.07.2011
comment
@ chris-farmiloe Будет ли db.put([instance1, instance2]) использовать меньше процессорного времени, чем db.put(instance1); db.put(instance2)?   -  person Roman Dolgiy    schedule 15.07.2011
comment
Поскольку это, вероятно, происходит в течение remote_api, да. Это два полных запроса против одного запроса   -  person Chris Farmiloe    schedule 16.07.2011


Ответы (3)


Это кажется высоким, и, вероятно, они заставляют сервер выполнять большую работу (декодирование JSON, кодирование и сохранение сущностей), которая может быть выполнена на клиенте. В SDK уже есть массовый загрузчик, и если он по какой-то причине не подходит, remote_api, на котором основан массовый загрузчик, обеспечивает более эффективный вариант, чем развертывание собственного.

person Nick Johnson    schedule 15.07.2011
comment
Я сейчас смотрю его код. Единственный импорт из gae в его файле views.py - из очереди задач импорта google.appengine.api. Похоже, он загружает порции данных через HTTP-команды. Это медленный способ сделать это? - person Jeff; 15.07.2011
comment
@ user793956 В конечном итоге это единственный способ получить данные в облаке, но загрузка их в формате JSON и обработка в облаке - пустая трата оплачиваемых ресурсов. Встроенный загрузчик выполняет обработку на клиенте и отправляет уже созданные буферы протокола в remote_api. - person Nick Johnson; 16.07.2011

Я массово загрузил гигабайт данных, однако я написал свой собственный модуль массовой загрузки (на основе определенных интерфейсов), и это заняло 25 часов процессорного времени.

Для получения дополнительной информации вы можете взглянуть на Производительность массового загрузчика App Engine

person Rahul    schedule 14.07.2011

Это во многом зависит от того, как он сериализирует данные. Я НАСТОЯТЕЛЬНО подозреваю, что он делает что-то неэффективное, поскольку да, это смехотворно для такого количества данных. Ваша неэффективность, вероятно, заключается во времени передачи и времени начала / окончания каждого запроса. Если он сериализует каждую строку и отправляет ее обработчику по одной, я могу полностью понять, что это занимает вечность и потребляет много времени процессора.

person Ken    schedule 14.07.2011
comment
Я сказал об этом программисту. Он пишет: «Все данные разбиты на 100 строк на файл json, каждая задача в очереди задач загружает такой кусок». Такое количество строк в файле я нашел наиболее оптимальным. Как я уже сказал, мы не тратим время процессора на загрузку данных и десериализацию, а только на сохранение в хранилище данных. - person Jeff; 15.07.2011