Ik ben bezig om een groot bestand te parsen i.c.m. met Symfony2 en Doctrine. Nadat er ongeveer 310 regels krijg ik een foutmelding te zien dat ik over de 128 MB kom. Zoals je kan zien heb ik om te proberen dit op te lossen een paar regels onderaan toegevoegd met unset. Dit vermindert het geheugengebruik echter niet, het wordt juist meer (getest met memory_get_usage). Wat kan ik doen om mijn geheugen te minimaliseren? Bij regel 300 ben ik namelijk nog niet eens op de 20%.
Als jullie meer code nodig hebben, zeggen jullie het maar. Ik ga niet meteen alles posten, dat is nogal veel.
<?php
/**
* @param string $line
*/
private function parseStudentLine($line) {
$parts = explode(chr(9), $line);
$student = $this->studentEntityRepository->findOneBy(array('code' => $parts[0]));
if (is_null($student)) {
$student = new Student($parts[0], $parts[1], $parts[2], $parts[3], $this->school);
$this->entityManager->persist($student);
$this->logger->debug(sprintf('Student %d (%s %s %s) added to database', $student->getCode(), $student->getFirstName(), $student->getInsertions(), $student->getLastName()));
}
$timetable = new Timetable($student, $this->startDate);
unset($parts[0], $parts[1], $parts[2], $parts[3]);
$lesson = null;
foreach ($parts as $part) {
if (strlen(trim($part)) == 0 || trim($part) == '0') continue;
$lesson = $this->parseLesson($part);
$foundLesson = $this->lessonEntityRepository->findOneBy(array('code' => $lesson->getCode()));
if ($foundLesson === null) {
$this->entityManager->persist($lesson);
} else {
$lesson = $foundLesson;
}
$timetable->addLesson($lesson);
}
$this->entityManager->persist($timetable);
$this->entityManager->flush();
$this->logger->info(sprintf('Added timetable for student %d (%s %s %s)', $student->getCode(), $student->getFirstName(), $student->getInsertions(), $student->getLastName()));
$this->entityManager->detach($timetable);
$this->entityManager->detach($student);
/** @var $lesson Lesson */
foreach ($timetable->getLessons() as $lesson) {
/** @var $teacher Teacher */
foreach ($lesson->getTeachers() as $teacher) {
$teacher = null;
unset($teacher);
}
$lesson = null;
unset($lesson);
}
$timetable = null;
unset($timetable);
$student = null;
unset($student);
$parts = null;
unset($parts);
}
?>