Implement limits for maximum number of symbols in autocomplete
Implemented to avoid excessive memory usage when loading big files with many unique words.
This commit is contained in:
parent
abad5cce0f
commit
eb41569e8d
|
@ -16,5 +16,6 @@ config.line_height = 1.2
|
|||
config.indent_size = 2
|
||||
config.tab_type = "soft"
|
||||
config.line_limit = 80
|
||||
config.max_symbols = 2000
|
||||
|
||||
return config
|
||||
|
|
|
@ -25,17 +25,29 @@ function autocomplete.add(t)
|
|||
autocomplete.map[t.name] = { files = t.files or ".*", items = items }
|
||||
end
|
||||
|
||||
local max_symbols = config.max_symbols or 2000
|
||||
|
||||
core.add_thread(function()
|
||||
local cache = setmetatable({}, { __mode = "k" })
|
||||
|
||||
local function get_symbols(doc)
|
||||
if doc.disable_symbols then return {} end
|
||||
local i = 1
|
||||
local s = {}
|
||||
local symbols_count = 0
|
||||
while i < #doc.lines do
|
||||
for sym in doc.lines[i]:gmatch(config.symbol_pattern) do
|
||||
if not s[sym] then
|
||||
symbols_count = symbols_count + 1
|
||||
if symbols_count > max_symbols then
|
||||
s = nil
|
||||
doc.disable_symbols = true
|
||||
collectgarbage('collect')
|
||||
return {}
|
||||
end
|
||||
s[sym] = true
|
||||
end
|
||||
end
|
||||
i = i + 1
|
||||
if i % 100 == 0 then coroutine.yield() end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue