Сообщение «Out of memory» в Delphi при работе с динамическими массивами скорее всего возникает при больших объёмах массивов и использовании функции SetLength в виде: SetLength(массив, Length(массив) + 1). Память пошагово, паленькими порциями, выделяемая под массив, оказывается «разорвана на куски», чем если бы ей выделяли сразу достаточно большой кусок. Выход простой: выделяем, как и положено, заранее просчитав необходимый объём, не x+1, а сразу достаточное количество памяти для решения типичной задачи. Если же памяти надо ещё больше — добавляем очередной большой кусок. Для контроля последней записи используем переменную.