<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Удаление элементов в больших таблицах.]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Удаление элементов в больших таблицах. форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 03 May 2026 05:23:27 +0300</pubDate>
		<item>
			<title>Удаление элементов в больших таблицах.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message44581/topic2961/">Удаление элементов в больших таблицах.</a></b> <i>Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц. </i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			исправлено:<br />--------------------------<br />-Новая &nbsp;реализация 2<br />tab1 = tabInit &nbsp;(N)<br /> numElement = #tab1<br /> startElement = numElement - ElemToKeep <br /> minus = numElement - ElemToKeep<br /> start=hrt.clock()<br />for i=1, ElemToKeep do &nbsp;tab1&#91;i&#93; = tab1&#91;startElement+i&#93; &nbsp;end<br /> tab1&#91; ElemToKeep+1&#93; =nill<br /> time=t_mcs(hrt.clock()-start)<br /> ne1 = tabCount2 (tab1)<br />print (&quot;Новая2=&quot;..time..&quot;;&quot;..ne1)<br />--------------------------<br /> Первая=1.566;5000<br />Вторая=0.783;5000<br />Новая1=0.756;5000<br />Новая2=0.718;5000<br />&gt;Exit code: 0 <br />
			<i>09.05.2020 08:50:48, Николай Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message44581/topic2961/</link>
			<guid>http://forum.quik.ru/messages/forum10/message44581/topic2961/</guid>
			<pubDate>Sat, 09 May 2020 08:50:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Удаление элементов в больших таблицах.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message44580/topic2961/">Удаление элементов в больших таблицах.</a></b> <i>Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц. </i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			в рассмотренных примерах для удаления данных требуется создание еще одной таблицы<br />можно уменьшить требуемый объем памяти если переписывать данные в туже таблицу а в конце ставить nil<br />при этом методе надо после записи последнего элемента записывать nil <br />например так:<br />--Новая &nbsp;реализация 2<br />tab1 = tabInit &nbsp;(N)<br /> numElement = #tab1<br /> startElement = numElement - ElemToKeep + 1<br /> minus = numElement - ElemToKeep<br /> start=hrt.clock()<br />for i=1, ElemToKeep do &nbsp;tab1&#91;i&#93; = tab1&#91;startElement+i&#93; &nbsp;end<br /> tab1&#91; ElemToKeep+1&#93; =nill<br /> time=t_mcs(hrt.clock()-start)<br /> ne1 = tabCount2 (tab1)<br />print (&quot;Новая2=&quot;..time..&quot;;&quot;..ne1)<br />--------------------------<br /><br />для точного измерения времени исполнения надо отключать сборщик мусора<br />----------------<br />в итоге получим следующий результат время в &nbsp;мс:<br /> Первая=1.661;5000<br />Вторая=0.777;5000<br />Новая1=0.758;5000<br />Новая2=0.704;4999<br />&gt;Exit code: 0 <br />
			<i>09.05.2020 08:48:29, Николай Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message44580/topic2961/</link>
			<guid>http://forum.quik.ru/messages/forum10/message44580/topic2961/</guid>
			<pubDate>Sat, 09 May 2020 08:48:29 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Удаление элементов в больших таблицах.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message44497/topic2961/">Удаление элементов в больших таблицах.</a></b> <i>Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц. </i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_6d6Omxrx" href="/user/2250/" bx-tooltip-user-id="2250">Иван Ру</a> написал:<br />Пока что вижу для себя такое решение -- формируем временную таблицу куда записываем только те элементы большой таблицы, которые нужно сохранить. Затем ставим знак равенства между большой нуждающейся в &quot;обрезке&quot; таблицей и временным вариантом (второй вариант, см. код ниже). Быстрее стандартного варианта в несколько сотен раз.<br /><br /><br />function tabInit (number)<br />	local tab ={}<br />	for i =1,number do<br />		tab<I>=i<br />	end<br />	return tab<br />end<br /><br />function tabCount2 (Thetab)<br />local count = 0 <br />	for k,v in ipairs (Thetab) do<br />		count = count+1<br />	end<br />	return count<br />end<br /><br /><br />-- ОЦЕНКА ПРОИЗВОДИТЕЛЬНОСТИ<br />	local ElemToKeep = 	5000<br />	tab1 = tabInit 	 &nbsp;(10000)<br />	tab2 = tabInit &nbsp; &nbsp;(10000)<br />	<br />	-- Первая реализация<br />	 local start = os.clock()<br />	 while #tab1 &gt; ElemToKeep do <br />		table.remove (tab1,1)<br />	 end	<br />	local ne1 = tabCount2 (tab1)<br />	local finish1 = os.clock()<br />	local time1 = finish1 - start<br />	message (tostring(time1)..&quot;-&quot;..tostring(ne1))<br /><br />	-- Вторая реализация<br />	local tempTab = {}<br />	local 	 numElement = #tab2<br />	local startElement = numElement - ElemToKeep + 1<br />	local minus = numElement - ElemToKeep<br />	<br />	for i=startElement, numElement do<br />		tempTab&#91;i-minus&#93; = tab2<I>		<br />	end<br />	tab2 = tempTab<br />	local ne2 = tabCount2 (tab2)<br />	local finish2 = os.clock()<br />	local time2 = finish2 - finish1<br />	message (tostring(time2)..&quot;-&quot;..tostring(ne2))	<br /><br />У меня на машине обрезка первым способом заняла 1,69 сек, а вторым - 0,002 сек.</I></I><br />=============<br />У вас ошибка в подсчете времени<br />вы включили в него время подсчета числа элементов - local ne2 = tabCount2 (tab2)<br />кроме того вместо удаления одного элемента можно удалять например половину копированием в новый массив и переприсвоением<br />время будет таким же как во втором случае<br />local ElemToKeep = 5000<br />local N=10000<br />--Новая &nbsp;реализация<br />tab1 = tabInit &nbsp;(N)<br /> local tempTab = {}<br />local numElement = #tab1<br />local startElement = numElement - ElemToKeep<br />start = os.clock()<br />for i=1, ElemToKeep do tempTab&#91;i&#93; = tab1&#91;startElement+i&#93; end<br />tab1 = tempTab<br /> time1 = os.clock() - start<br />ne1 = tabCount2 (tab1)<br />print (&quot;Новая=&quot;..tostring(time1)..&quot;;&quot;..tostring(ne1))<br />------------------<br />Первая=1.682;5000<br /> Вторая=0.00099999999999989;5000<br />Новая=0.0010000000000001;5000 <br />
			<i>08.05.2020 12:12:40, Николай Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message44497/topic2961/</link>
			<guid>http://forum.quik.ru/messages/forum10/message44497/topic2961/</guid>
			<pubDate>Fri, 08 May 2020 12:12:40 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Удаление элементов в больших таблицах.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message25914/topic2961/">Удаление элементов в больших таблицах.</a></b> <i>Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц. </i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Судя по написанному, Вам нужно реализовать в своём скрипте циклический буфер (кольцевой буфер) на базе массиве.<br /><br /><noindex><a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D1%8C%D1%86%D0%B5%D0%B2%D0%BE%D0%B9_%D0%B1%D1%83%D1%84%D0%B5%D1%80" target="_blank" rel="nofollow">https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D1%8C%D1%86%D0%B5%D0%B2%D0%BE%D0<WBR/>&shy;%B9_%D0%B1%D1%83%D1...</a></noindex><br /><br />В такой структуре данных легко добавлять в конец, удалять из начала и итерировать по элементам. Если в буфере кончилось свободное место, можно увеличить его размер, скажем, вдвое.<br /><br />Пример реализации на lua (не ручаюсь за качество): <noindex><a href="https://gist.github.com/johndgiese/3e1c6d6e0535d4536692" target="_blank" rel="nofollow">https://gist.github.com/johndgiese/3e1c6d6e0535d4536692</a></noindex> <br />
			<i>24.07.2017 06:47:31, _sk_.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message25914/topic2961/</link>
			<guid>http://forum.quik.ru/messages/forum10/message25914/topic2961/</guid>
			<pubDate>Mon, 24 Jul 2017 06:47:31 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Удаление элементов в больших таблицах.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message25912/topic2961/">Удаление элементов в больших таблицах.</a></b> <i>Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц. </i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_zpEA6dlF" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br /> Иван Ру &nbsp;, <br /><br />вам действительно нужно хранить в памяти все эти десятки тысяч записей?<br />Я понимаю, когда речь идет о текущей итерации скрипта, но ведь вы храните даже не агрегированные данные, а непосредственно данные по сделкам. Какой в этом смысл, если сделка прошла, условно говоря, 15 минут назад, а за это время вы получили еще 5000 сделок? Если вам необходимо сохранять эти сделки для последующей обработки сторонним приложением, так пишите их сразу в файл, но не сохраняйте в памяти.<br />Все же мое мнение со стороны (оно может быть ошибочным): необходимо оптимизировать логику скрипта как такового, &quot;облегчая&quot; его.<br />=============<br />Это не принципиально - т.к. речь о проблеме кодинга и языка. <br />Есть ли нужда в таком? Не скажу что критичная, но есть -- данные нужны для оперативного подсчета средних значений, и не по барам, а за произвольный период. Причем этот подсчет должен производиться максимально быстро. <br />
			<i>23.07.2017 23:25:33, Иван Ру.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message25912/topic2961/</link>
			<guid>http://forum.quik.ru/messages/forum10/message25912/topic2961/</guid>
			<pubDate>Sun, 23 Jul 2017 23:25:33 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Удаление элементов в больших таблицах.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message25911/topic2961/">Удаление элементов в больших таблицах.</a></b> <i>Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц. </i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_Y4fPM6kv" href="/user/2250/" bx-tooltip-user-id="2250">Иван Ру</a>, <br /><br />вам действительно нужно хранить в памяти все эти десятки тысяч записей?<br />Я понимаю, когда речь идет о текущей итерации скрипта, но ведь вы храните даже не агрегированные данные, а непосредственно данные по сделкам. Какой в этом смысл, если сделка прошла, условно говоря, 15 минут назад, а за это время вы получили еще 5000 сделок? Если вам необходимо сохранять эти сделки для последующей обработки сторонним приложением, так пишите их сразу в файл, но не сохраняйте в памяти.<br />Все же мое мнение со стороны (оно может быть ошибочным): необходимо оптимизировать логику скрипта как такового, "облегчая" его. <br />
			<i>23.07.2017 16:48:04, Andrei2016.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message25911/topic2961/</link>
			<guid>http://forum.quik.ru/messages/forum10/message25911/topic2961/</guid>
			<pubDate>Sun, 23 Jul 2017 16:48:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Удаление элементов в больших таблицах.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message25909/topic2961/">Удаление элементов в больших таблицах.</a></b> <i>Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц. </i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Пока что вижу для себя такое решение -- формируем временную таблицу куда записываем только те элементы большой таблицы, которые нужно сохранить. Затем ставим знак равенства между большой нуждающейся в &quot;обрезке&quot; таблицей и временным вариантом (второй вариант, см. код ниже). Быстрее стандартного варианта в несколько сотен раз.<br /><br /><br />function tabInit (number)<br />	local tab ={}<br />	for i =1,number do<br />		tab&#91;i&#93;=i<br />	end<br />	return tab<br />end<br /><br />function tabCount2 (Thetab)<br />local count = 0 <br />	for k,v in ipairs (Thetab) do<br />		count = count+1<br />	end<br />	return count<br />end<br /><br /><br />-- ОЦЕНКА ПРОИЗВОДИТЕЛЬНОСТИ<br />	local ElemToKeep = 	5000<br />	tab1 = tabInit 	 &nbsp;(10000)<br />	tab2 = tabInit &nbsp; &nbsp;(10000)<br />	<br />	-- Первая реализация<br />	 local start = os.clock()<br />	 while #tab1 &gt; ElemToKeep do <br />		table.remove (tab1,1)<br />	 end	<br />	local ne1 = tabCount2 (tab1)<br />	local finish1 = os.clock()<br />	local time1 = finish1 - start<br />	message (tostring(time1)..&quot;-&quot;..tostring(ne1))<br /><br />	-- Вторая реализация<br />	local tempTab = {}<br />	local 	 numElement = #tab2<br />	local startElement = numElement - ElemToKeep + 1<br />	local minus = numElement - ElemToKeep<br />	<br />	for i=startElement, numElement do<br />		tempTab&#91;i-minus&#93; = tab2&#91;i&#93;		<br />	end<br />	tab2 = tempTab<br />	local ne2 = tabCount2 (tab2)<br />	local finish2 = os.clock()<br />	local time2 = finish2 - finish1<br />	message (tostring(time2)..&quot;-&quot;..tostring(ne2))	<br /><br />У меня на машине обрезка первым способом заняла 1,69 сек, а вторым - 0,002 сек. <br />
			<i>22.07.2017 23:44:37, Иван Ру.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message25909/topic2961/</link>
			<guid>http://forum.quik.ru/messages/forum10/message25909/topic2961/</guid>
			<pubDate>Sat, 22 Jul 2017 23:44:37 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Удаление элементов в больших таблицах.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message25908/topic2961/">Удаление элементов в больших таблицах.</a></b> <i>Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц. </i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Столкнулся с проблемой - скрипты &quot;падают&quot; из-за нехватки памяти. В одной из них формируется несколько сотен таблиц, в каждую из которых два раза в секунду добавляется новые элемент (история бид, оффер и сделок, подробнее см. <noindex><a href="https://forum.quik.ru/forum10/topic2958/" target="_blank" rel="nofollow">https://forum.quik.ru/forum10/topic2958/</a></noindex>). Я пришел к выводу, что без удаления &quot;старых&quot; исторических значений из этих таблиц в течение сессии / одного запуска не обойтись. Однако, обнаружилось, что это очень затратная по ресурсам / времени процедура для которой я не вижу удобных альтернатив.<br />Стандартный подход - использовать table.remove. Однако, он дает возможность удалять только один элемент, при удалении первых элементов в массиве, многократно меняются индексы всех последующих элементов, что требует много времени. Так удаление первых 5 тысяч элементов таблицы с 10 тыс. полей заняло у меня 6,5 сек. - непозволительно долго.<br />Пример кода:<br />	local ElemToKeep = 5000<br />	tab1 = tabInit (1000000)<br />while #tab1 &gt; ElemToKeep do <br />table.remove (tab1,1)<br />end	<br /><br />Есть обходные пути. <br />Можно использовать простое удаление элементов, например, так:<br />	--local 	 numElement = #tab2<br />	--local toremove = numElement - ElemToKeep<br />	--for k = 1, toremove, 1 do <br />		--tab2&#91;k&#93; = nil<br />	--end	<br />Работа такого кода происходит гораздо быстрее (приблизительно в 2 тысячи раз в упомянутых условиях!). Однако, если мы удалим элементы в начале таблицы, например, с 1 по 2000, мы не сможем использовать их перебор через &nbsp;ipairs, и хуже того, мы не сможем оперативно посчитать число элементов в таблице с использованием #. Их число можно будет получить только путем перебора с вставкой счетчика в цикл pairs. <br />Можно изголяться дальше в этом направлении. Например, каждый раз вставлять новые элементы в таблицу с использованием table.insert и присваивать им индекс 1, сдвигая все остальные в конец. Это решит проблему с ipairs, # и подсчетом элементов - достаточно будет обрезать &quot;хвост&quot; массива/таблицы, индексы будут начинаться с единицы и будут идти без пробелов. Однако, такой подход означает, что мы все равно выполняем ресурсозатратную процедуру (переименование индексов) -- с меньшей потерей времени, но чаще (при каждом добавлении нового элемента). <br />Есть ли у кого-то пример эффективного решения подобной проблемы? <br />
			<i>22.07.2017 23:28:57, Иван Ру.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message25908/topic2961/</link>
			<guid>http://forum.quik.ru/messages/forum10/message25908/topic2961/</guid>
			<pubDate>Sat, 22 Jul 2017 23:28:57 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
