diff --git a/frontend/ui/message/streammessagequeue.lua b/frontend/ui/message/streammessagequeue.lua index bf51a005b..58ed30931 100644 --- a/frontend/ui/message/streammessagequeue.lua +++ b/frontend/ui/message/streammessagequeue.lua @@ -57,7 +57,13 @@ end function StreamMessageQueue:waitEvent() local data = "" - while czmq.zpoller_wait(self.poller, 0) ~= nil do + -- Successive zframes may be tens or hundreds in some cases + -- if they are concatenated in a single loop it may run up memory of the + -- machine. And it did happened when receiving file data from Calibre server. + -- Here we receive only receive 10 packages at most in one waitEvent loop, and + -- call receiveCallback immediately. + local wait_packages = 10 + while czmq.zpoller_wait(self.poller, 0) ~= nil and wait_packages > 0 do local id_frame = czmq.zframe_recv(self.socket) if id_frame ~= nil then local id = self:handleZframe(id_frame) @@ -66,6 +72,7 @@ function StreamMessageQueue:waitEvent() if frame ~= nil then data = data .. (self:handleZframe(frame) or "") end + wait_packages = wait_packages - 1 end if self.receiveCallback and data ~= "" then self.receiveCallback(data) diff --git a/plugins/calibrecompanion.koplugin/main.lua b/plugins/calibrecompanion.koplugin/main.lua index 69afa6310..440c079e8 100644 --- a/plugins/calibrecompanion.koplugin/main.lua +++ b/plugins/calibrecompanion.koplugin/main.lua @@ -332,6 +332,7 @@ function CalibreCompanion:sendBook(arg) -- switching to raw data receiving mode self.calibre_socket.receiveCallback = function(data) --DEBUG("receive file data", #data) + --DEBUG("Memory usage KB:", collectgarbage("count")) local to_write_data = data:sub(1, to_write_bytes) outfile:write(to_write_data) to_write_bytes = to_write_bytes - #to_write_data