Skip to content

Memory Issue with Sortable DataObject Decorator #11

gordonbanderson opened this Issue Jun 20, 2011 · 3 comments

2 participants


I've been tracing a memory leak for some time and have finally tracked it down to the onBeforeWrite method of the SortableDataObject decorate. The symptom I saw was not being able to save a single Image due to memory constraints, and the memory jumping from 29M to > 128M when saving the Image.

The culprit is here

public function onBeforeWrite()
        if(!$this->owner->ID) {
            if($peers = DataObject::get($this->owner->class))
                $this->owner->SortOrder = $peers->Count()+1;

The line

  if($peers = DataObject::get($this->owner->class))

is loading all of the DataObjects of a particular class, e.g. Image, into memory, counting them, and setting the SortOrder to be one more than the maximum.

As a site gets bigger this will result in more memory being used when saving an object of a given class, eventually resulting in a memory leak preventing objects being saved.

In short, the number of objects of a given DataObject class are effectively limited by the amount of RAM allocated to the PHP process.



this issue occured today for me, too. I solved it by changing the method "onBeforeWrite" in "SortableDataObject" to the following:

if(!$this->owner->ID) {
    $sortOrder = 0;
    $records   = DB::query(
                MAX(SortOrder) AS maxSortOrder
                ClassName = '%s'",

    if ($records) {
        foreach ($records as $record) {
            $sortOrder = $record['maxSortOrder'];

        $sortOrder = (int) $sortOrder + 1;
    $this->owner->SortOrder = $sortOrder;

This solves the memory consumption issue.

@unclecheese: could this be patched into DOM for future versions?

All the best,


Saksoth's code can be found here gordonbanderson@3beba35


I think this has been resolved here, JonasAleknavicius@aab754f

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.