use*_*476 8 symfony doctrine-orm
我正在开发一个项目,我必须从数据库中收集大量数据.我正在使用Symfony2(symfony bf1281aebdc842a39ec0eb7438e1ea3fca9b9705)和Doctrine2(学说3b3186ee98392802a44118cd421a3530119aa7eaand)作为工作基础.
我遇到的问题是,我必须获取大约15.000篇文章.在那之后,我需要在文章id的基础上迭代所有这些数据获取更多数据(与ie(继承)媒体或价格等有直接和间接关联...).大约50-100条记录是可以的,但如果我想使用更多记录,则需要花费大量时间从数据库中获取所有内容.
有没有办法迭代数据而不用掉所有剩余的ram?有没有办法告诉学说停止使用引用?
预先感谢您的任何帮助!
使用以下方法保存另一行:
$iterableResult = $doctrine->getManager()->createQuery("SELECT c FROM ENTITY c")->iterate();
while ((list($obj) = $iterableResult->next()) !== false) {
// do something with $obj
$em->detach($obj);
}
Run Code Online (Sandbox Code Playgroud)
您可以研究在 Doctrine 中使用迭代(逐步)水合作用:
$em = $this->getDoctrine()->getEntityManager();
$q = $em->createQuery("<DQL to select the objects I want>");
$iterableResult = $q->iterate();
while (($row = $iterableResult->next()) !== false) {
// do stuff with the data in the row, $row[0] is always the object
$em->detach($row[0]); // detach from Doctrine, so that it can be GC'd immediately
}
Run Code Online (Sandbox Code Playgroud)
这篇文章的详细信息,在质量对象处理下
如果没有更多关于你想要做什么的细节,很难准确地回答。
学说通常不太适合您可能描述的主要数据处理。我有几个项目仅使用 DBAL 来运行原始 SQL 来处理复杂的报告之类的事情。
也就是说,如果您实际上不需要一次加载所有 15k 条记录,那么就不要立即加载它们!抓取 50 个,处理它们,释放内存,然后重复。这种方法可以随时保留总数,因此可以获得整个集合的一些汇总统计数据。
也就是说,如果您需要聚合的东西,您可能正在构建某种“报告”,并且您最好使用纯 SQL,甚至一些存储过程,并且不要让 ORM 参与其中。