Hello all,

I'm using the following Lua script to fetch data from Redis, which is in form 
of list:

function split(str, delimiter)
    for token in string.gmatch(str, "[^" .. delimiter .. "]+") do
        return token
    end
end

function contains(mainString, subString)
    return string.find(mainString, subString, 1, true) ~= nil
end

function longest_match_acode()

                local currentSeconds = os.time()
                local milliseconds = os.clock() * 1000
                local ddate = os.date("%Y-%m-%d %H:%M:%S", currentSeconds) .. 
string.format(".%03d", milliseconds)
                KSR.xlog.xinfo("starting date:" ..ddate)

                local size = 0
                local result

                local acode = "29192"
                local inputbcode = "4474173"
                local delimiter = ":"

                while size == 0 do
                                local currentSeconds = os.time()
                                acode = string.sub(acode, 1, string.len(acode) 
- 1)
                                KSR.ndb_redis.redis_cmd("srvN", "LRANGE price:" 
.. acode .." 0 -1", "r")
                                size = tonumber(KSR.pv.get("$redis(r=>size)"))
                end

                local left = 0
                local right = size - 1

                while left <= right do
                    local currentSeconds = os.time()
        local milliseconds = os.clock() * 1000
        local ddate = os.date("%Y-%m-%d %H:%M:%S", currentSeconds) .. 
string.format(".%03d", milliseconds)

                                resultRight = 
tostring(KSR.pv.get("$redis(r=>value[" .. right .. "])"))
                                resultLeft = 
tostring(KSR.pv.get("$redis(r=>value[" .. left .. "])"))

                                local bcodeLeft = split(resultLeft, delimiter)
                                local bcodeRight = split(resultRight, delimiter)

                                if contains(inputbcode, bcodeRight) then
                                                KSR.xlog.xinfo("Input bcode 
contains bcode value from Redis: " .. resultRight .. " at index: " .. right .. 
" with date: " .. ddate)
                                end

                                if contains(inputbcode, bcodeLeft) then
                                   KSR.xlog.xinfo("Input bcode contains bcode 
value from Redis: " .. resultLeft .. " at index: " .. left .. " with date: " .. 
ddate)
                                end
                                left = left + 1
                                right = right - 1
                end
                local currentSeconds = os.time()
                local milliseconds = os.clock() * 1000
                local ddate = os.date("%Y-%m-%d %H:%M:%S", currentSeconds) .. 
string.format(".%03d", milliseconds)
                KSR.xlog.xinfo("ending date:" ..ddate)

end

function ksr_request_route()

                if KSR.is_INVITE() then
        longest_match_acode()
        KSR.sl.send_reply("404", "Not found");
                end
end

I'm getting the following warning in the log : WARNING: LUA {INVITE}: <core> 
[core/pvapi.c:340]: pv_cache_add(): pv cache limit is going to be exceeded - 
pkg memory may get filled with pv declarations
I think the issue is in the following lines:
resultRight = tostring(KSR.pv.get("$redis(r=>value[" .. right .. "])"))
resultLeft = tostring(KSR.pv.get("$redis(r=>value[" .. left .. "])"))

the list coming from Redis has around 30k items, which I'm iterating through 
using value[x] which is exhausting the pv declaration as per my understanding.
How to overcome this issue? Is it possible to save the list as an array 
variable and then iterate through that array?

Regards,
__________________________________________________________
Kamailio - Users Mailing List - Non Commercial Discussions
To unsubscribe send an email to sr-users-le...@lists.kamailio.org
Important: keep the mailing list in the recipients, do not reply only to the 
sender!
Edit mailing list options or unsubscribe:

Reply via email to