<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: awk &apos;out of memory in array&apos;</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID1/78760.html</link>
    <description>Имеется большой файл по трафику с таким содержимым:&lt;br&gt;ip1  ip2 packets  bytes&lt;br&gt;ip2  ip3 packets2  bytes2&lt;br&gt;и т.д&lt;br&gt;Нужно как-то просуммировать пакеты и байты по совпадающим парам ип.&lt;br&gt;На awk сделал так:&lt;br&gt;awk &apos;&#123;k=$0;&lt;br&gt;    sub(/&#091; &#092;t&#093;+&#091;0-9&#093;+&#091; &#092;t&#093;+&#091;0-9&#093;+$/,&quot;&quot;,k);&lt;br&gt;if ( NF==4 )&#123; s1&#091;k&#093;+=$3;   s2&#091;k&#093;+=$4;&#125;&#125;&lt;br&gt;    END &#123;for(k in s1)&#123;print k,s1&#091;k&#093;,s2&#091;k&#093;&#125;&#125;&apos; traffic.dump_wait_agg &amp;gt;&amp;gt; traffic.dump&lt;br&gt;&lt;br&gt;В итоге все работает как надо, но на больших файлах awk начинает ругаться - out of memory in array. Файлики могут быть по 1 Гб, оперативки 4 Гб.&lt;br&gt;Подскажите как сделать иначе или может не на awk даже, чтоб на больших объемах не падало.&lt;br&gt;</description>

<item>
    <title>awk &apos;out of memory in array&apos; (AD)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID1/78760.html#15</link>
    <pubDate>Tue, 19 Feb 2008 05:35:10 GMT</pubDate>
    <description>&amp;gt;Ничего себе пожирание памяти. Не должно такого происходить. Можете привести код, который &lt;br&gt;&amp;gt;использовали? &lt;br&gt;&lt;br&gt;Оставил Ваш вариант как основной. &lt;br&gt;Файл 900 мег, 16 млн строк.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>awk &apos;out of memory in array&apos; (angra)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID1/78760.html#14</link>
    <pubDate>Mon, 18 Feb 2008 19:27:44 GMT</pubDate>
    <description>Ничего себе пожирание памяти. Не должно такого происходить. Можете привести код, который использовали?&lt;br&gt;</description>
</item>

<item>
    <title>awk &apos;out of memory in array&apos; (AD)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID1/78760.html#13</link>
    <pubDate>Mon, 18 Feb 2008 18:09:20 GMT</pubDate>
    <description>В общем сделал на perl, как  angra советовал (готовый совет не хотелось сразу, хотел сам сделать, в итоге к почти такому и пришел :) ).&lt;br&gt;900 Мб файлик делал минуты 3-4, оперативки занял 1,6 Гб. На выходе файлик получился 180 Мб.&lt;br&gt;Спасибо большое всем за наставления ;)&lt;br&gt;Оставлю пока так, если уж будет совсем тяжко, тогда буду либо делить, либо netflow тот же юзать.&lt;br&gt;</description>
</item>

<item>
    <title>awk &apos;out of memory in array&apos; (angra)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID1/78760.html#12</link>
    <pubDate>Mon, 18 Feb 2008 13:58:09 GMT</pubDate>
    <description>Так бы сразу сказали, я бы еще в прошлом сообщении привел пример&lt;br&gt;Исходим из того что все значения в строке разделены пробелом. Тогда имеем&lt;br&gt;#!/usr/bin/perl&lt;br&gt;use strict;&lt;br&gt;my &#037;sums; #хеш для суммирования, ключами будут пары ip, значениями ссыслка на массив из двух элементов &#091;сумма пакетов, сумма байт&#093;&lt;br&gt;while (&amp;lt;&amp;gt;) &#123; #читаем со стандартного ввода или из файлов переданных в виде аргументов&lt;br&gt;        my &#064;vals = split;#разбиваем строку на элементы&lt;br&gt;        my $k=&quot;$vals&#091;0&#093; $vals&#091;1&#093;&quot;; #формируем ключ для хеша конкатенацией пары ip&lt;br&gt;        $sums&#123;$k&#125;-&amp;gt;&#091;0&#093; += $vals&#091;2&#093;; #суммируем пакеты&lt;br&gt;        $sums&#123;$k&#125;-&amp;gt;&#091;1&#093; += $vals&#091;3&#093;; #суммируем байты&lt;br&gt;&#125;&lt;br&gt;print &quot;Results:&#092;n&quot;;&lt;br&gt;print &quot;$_: $sums&#123;$_&#125;-&amp;gt;&#091;0&#093; $sums&#123;$_&#125;-&amp;gt;&#091;1&#093;&#092;n&quot; foreach (keys &#037;sums) #выводим все пары, при желании можно добавить sort перед keys&lt;br&gt;&lt;br&gt;Ну и пример выполнения&lt;br&gt;$ ./a.pl&lt;br&gt;1.1.1.1 1.1.1.2 10 15&lt;br&gt;1.1.1.1 1.1.1.3 10 15&lt;br&gt;1.1.1.1 1.1.1.2 10 15&lt;br&gt;1.1.1.2 1.1.1.3 20 20&lt;br&gt;Results:&lt;br&gt;1.1.1.2 1.1.1.3: 20 20&lt;br&gt;1.1.1.1 1.1.1.3: 10 15&lt;br&gt;1.1.1.1 1.1.1.2: 20 30&lt;br&gt;&lt;br&gt;Возможной проблемой мо</description>
</item>

<item>
    <title>awk &apos;out of memory in array&apos; (ShyLion)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID1/78760.html#11</link>
    <pubDate>Mon, 18 Feb 2008 09:57:59 GMT</pubDate>
    <description>&amp;gt;&amp;gt;Подскажите как сделать иначе или может не на awk даже, чтоб на &lt;br&gt;&amp;gt;&amp;gt;больших объемах не падало. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Например, суммировать &quot;частями&quot;, потом частичные суммы суммировать. &lt;br&gt;&amp;gt;Или скормить твой гигабайт sort-у :) и суммировать awk-ом с _одой_ суммой &lt;br&gt;&amp;gt;единовременно. &lt;br&gt;&amp;gt;Или ещё какой хитрый &quot;дизигн&quot;-подход применить... Например, избавиться от гигабайтных логов совсем. &lt;br&gt;&amp;gt;&lt;br&gt;&lt;br&gt;Ага, например сливать не аккаунтинг, а NetFlow, и flow-tools&apos;ами анализировать :)&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>awk &apos;out of memory in array&apos; (pavel_simple)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID1/78760.html#10</link>
    <pubDate>Mon, 18 Feb 2008 09:36:57 GMT</pubDate>
    <description>&amp;gt;Так я тоже делал, разницы особой нету. По крайней мере, гиг не &lt;br&gt;&amp;gt;переварило. &lt;br&gt;&lt;br&gt;&quot;ну тогда незнаю&quot; (C) Народная мудрось&lt;br&gt;&lt;br&gt;&lt;br&gt;Linux XXXX 2.6.22-3-amd64 #1 SMP Tue Feb 12 09:22:35 UTC 2008 x86_64 GNU/Linux&lt;br&gt;&lt;br&gt;mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan&lt;br&gt;&lt;br&gt;compiled limits:&lt;br&gt;max NF             32767&lt;br&gt;sprintf buffer      2040&lt;br&gt;&lt;br&gt;ls -lah aaa.log &lt;br&gt;-rw-r--r-- 1 pavel pavel 2,2G 2008-02-18 14:23 aaa.log&lt;br&gt;&lt;br&gt; time cat aaa.log &amp;#124; grep -v &quot;Accounting&quot;&amp;#124;grep -v &quot;Source&quot;&amp;#124; awk &apos;&#123;s1&#091;$1&quot;&#092;t&quot;$2&#093;+=$3;s2&#091;$1&quot;&#092;t&quot;$2&#093;+=$4;&#125; END &#123;for(k in s1)&#123;print k,s1&#091;k&#093;,s2&#091;k&#093;&#125;&#125;&apos;&amp;gt;aaa.done.log&lt;br&gt;&lt;br&gt;real2m11.159s&lt;br&gt;user2m3.672s&lt;br&gt;sys0m14.169s&lt;br&gt;&lt;br&gt;даже учитавая то, что файлик aaa.log был создан искусственно (слепил десяток) памяти сожрал всего-то 100M&lt;br&gt;</description>
</item>

<item>
    <title>awk &apos;out of memory in array&apos; (Andrey Mitrofanov)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID1/78760.html#9</link>
    <pubDate>Mon, 18 Feb 2008 08:43:15 GMT</pubDate>
    <description>&amp;gt;Подскажите как сделать иначе или может не на awk даже, чтоб на &lt;br&gt;&amp;gt;больших объемах не падало. &lt;br&gt;&lt;br&gt;Например, суммировать &quot;частями&quot;, потом частичные суммы суммировать.&lt;br&gt;Или скормить твой гигабайт sort-у :) и суммировать awk-ом с _одой_ суммой единовременно.&lt;br&gt;Или ещё какой хитрый &quot;дизигн&quot;-подход применить... Например, избавиться от гигабайтных логов совсем.&lt;br&gt;</description>
</item>

<item>
    <title>awk &apos;out of memory in array&apos; (AD)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID1/78760.html#8</link>
    <pubDate>Mon, 18 Feb 2008 03:42:56 GMT</pubDate>
    <description>&amp;gt;&amp;gt;Буду пробовать, наверно perl также поведет себя. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Это смотря как напишите и насколько много разных пар. Вам понадобится количество &lt;br&gt;&amp;gt;памяти равное: (количество разных пар) * (размер в байтах одного элемента &lt;br&gt;&amp;gt;хеша). Последнее врядли получится больше 20 байт и в любом случае &lt;br&gt;&amp;gt;общее количество сожранной памяти будет меньше исходного размера файла. &lt;br&gt;&amp;gt;Приходилось при помощи перла удалять дублирующиеся строки в 30+ гиговых файлах и &lt;br&gt;&amp;gt;проблем не возникло, в процессе работы сжирало около сотни метров памяти. &lt;br&gt;&amp;gt;&lt;br&gt;&lt;br&gt;В perl не силен, это как получится :)&lt;br&gt;</description>
</item>

<item>
    <title>awk &apos;out of memory in array&apos; (AD)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID1/78760.html#7</link>
    <pubDate>Mon, 18 Feb 2008 03:37:40 GMT</pubDate>
    <description>&amp;gt;а так? &lt;br&gt;&amp;gt;awk &apos;&#123;if ( NF==4 )&#123; s1&#091;$1&quot;-&quot;$2&#093;+=$3;s2&#091;$1&quot;-&quot;$2&#093;+=$4;&#125;&#125; END &#123;for(k in s1)&#123;print k,s1&#091;k&#093;,s2&#091;k&#093;&#125;&#125;&apos; &lt;br&gt;&amp;gt;ИМХО от NF&apos;а лучше заранее избавится grep&apos;ом &lt;br&gt;&lt;br&gt;Так я тоже делал, разницы особой нету. По крайней мере, гиг не переварило.&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

</channel>
</rss>
