У нас возникают странные проблемы с производительностью:
Мы точно знаем, что это не проблема с БД (пробовал с реальным экземпляром MongoDB, все тот же результат).
Мы определили объекты, которые работают с Doctrine ODM таким образом:
<?php
namespace CatalogueManager\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Doctrine\Common\Collections\ArrayCollection;
/*
* @ODM\Document(repositoryClass="CatalogueManager\Repository\ProductRepository")
*/
class Item
{
/** @ODM\Id */
protected $id;
/** @ODM\String */
protected $name;
/** @ODM\Timestamp */
protected $created;
/** @ODM\Timestamp */
protected $updated;
// ---------------------------------------------------------------------- //
/**
* Return properties as an array. Helper method to assist with converting
* doctrine objects to arrays so we can return front-end api calls as json.
*
* Required as currently Doctrine ODM do not support array hydration of
* referenced documents.
*
* @access public
* @return array
*
*/
public function toArray()
{
$arr = ['id' => $this->id,
'name' => $this->name,
'urlSlug' => $this->urlSlug,
'desc' => $this->desc,
'metaData' => $this->metadata,
'category' => $this->category,
'brand' => $this->brand,
'assets' => $this->assets,
'shipping' => $this->shipping,
'specs' => $this->specs,
'attrs' => $this->attrs,
'optionTypes' => $this->optionTypes
];
return $arr;
}
// ---------------------------------------------------------------------- //
/**
* Getter
*
* @access public
* @return string
*
*/
public function getId()
{
return $this->id;
}
/**
* Getter
*
* @access public
* @return string
*
*/
public function getName()
{
return $this->name;
}
// ---------------------------------------------------------------------- //
/**
* Setter
*
* @param string $value Property value
*
* @access public
* @return void
*
*/
public function setName($value)
{
$this->name = $value;
}
}
Мы используем их для импорта ок. 100 продуктов в базу данных продуктов. Все это занимает около 5 секунд на реальной машине, но при попытке на виртуальная машина, это занимает ок. 25 секунд сделать то же самое.
Похоже, проблема может быть апаш который принимает Нагрузка 99% пока все это обрабатывается, все же мне трудно точно определить, что на самом деле происходит.
Любой совет будет оценен …
Кажется, это происходит только тогда, когда пишу данные. Чтение данных вроде бы нормально.
Доступны данные Webgrind (скриншот): https://www.dropbox.com/s/jjlg7ano6epy6t1/webgrind.png?dl=0
Посмотрев на некоторые скриншоты данных XDebug, я думаю, что вы просто неправильно используете ORM / ODM, поскольку вы выполняете пакетную обработку результатов> 13K.
Правильное решение для такого рода операций объясняется в http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html
То, что происходит, очень просто:
— ODM загружает одну запись из БД
— ODM сохраняет эту запись в UnitOfWork
— при сбросе ODM перебирает все записи в UnitOfWork
, ищу измененные документы / юридические лица
Если вы продолжаете хранить больше данных в UnitOfWork
тогда очевидно, что итерация будет занимать больше времени при каждом повторении операции.
Вам следует позвонить ObjectManager#clear()
между партиями обрабатываемых кусков.
Так что это не будет ответом, я постараюсь дать совет. Это нормально для вещей, которые работают медленнее на локальной машине, не говоря уже о виртуальной.
Вещи, которые могут быть полезны:
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--memory", "1024"]
end
И просто примечание. Почему вы запускаете php 5.5 на 12.04, а не на 14.04 (это более правдоподобно, но не так точно). Это проще настроить.