Ограничение памяти приложения Tarantool - PullRequest
0 голосов
/ 24 мая 2018

добрый день. Я новичок в tarantool, и у меня есть вопрос об ограничении памяти для клиентских приложений внутри tarantool. У меня есть база данных в памяти для 300 миллионов элементов и приложение lua, которое выбирает часть из них, после выбора, я переносу результат в ' class 'для более простого взаимодействия с кодом.Например:

Foo = {}
Foo.__index = Foo

function Foo.create(rawData)
    local self = setmetatable({}, Foo)

    self.PrimaryId = rawData[1]
    self.BarId     = rawData[2]

    local fields = rawData[3]
    self.Name    = fields[1]
    self.Date    = fields[2]

    return self
end

и использование:

local data = box.space.Foo.index.barId:select({barId})
local ctor = Foo.create
local foo = {}

for i = 1, #data do
    table.insert(foo, ctor(data[i]))
end

при первом запуске в большинстве случаев он выполняется успешно, но при втором с вероятностью 100% происходит сбой с сообщением (сообщение tarantool):

PANIC: unprotected error in call to Lua API (not enough memory)

Я понимаю, что есть проблемы с использованием памяти (не освобождаемая память), но у меня есть вопрос по поводу лимита - есть ли какие-то ограничения для приложения lua?потому что я вижу в мониторе потребление памяти и замечаю, что достаточно свободной памяти и сбой возник после запуска приложения, использующего более 1,2 Гб

1 Ответ

0 голосов
/ 25 мая 2018

Tarantool использует luajit, это означает, что ограничение исходит от luajit [1].

Кроме того, luajit (как и lua) имеет проблему с сборщиком мусора [2], иногда вам приходится вызывать его вручную[3] или у вас будет «паника ООМ».

[1] Ссылки:

[2] http://wiki.luajit.org/New-Garbage-Collector

[3] http://luatut.com/collectgarbage.html

...