Farsh
~ on ~ high ~ wave ~
Представим теоретическую задачу:
Есть список текстов, нужно для каждого текста составить массив [слово => кол-во вхождений в этот текст]
Генерировать тексты будем сами; например так:
Тут мы генерируем 1 тысячу текстов, в каждом 1 тысяча слов. Кол-во уникальных слов на весь корпус = 10 тысяч.
Пример №1, без ссылок:
Xdebug показывает используемую память:
перед началом генерации текстов: 28553844
перед началом обработки текстов: 61861172
после обработки текстов: 165037160
Пример №2, c ссылками:
Все просто - храним один массив со всеми уникальным словами, коих будет 10000, а при обработке текстов ссылаемся на него, что, в теории, должно сэкономить память.
Но результаты оказались иными:
перед началом генерации текстов: 28557252
перед началом обработки текстов: 61863696
после обработки текстов: 331917160
То есть стало использоваться в 2 раза больше памяти
Вопрос:
почему такое происходит ?
Есть список текстов, нужно для каждого текста составить массив [слово => кол-во вхождений в этот текст]
Генерировать тексты будем сами; например так:
PHP:
$texts = array();
for($i=0; $i<1000; ++$i)
{
$words = array();
for($z=0; $z<1000; ++$z)
{
$words[] = md5(mt_rand(1, 10000));
}
$texts[$i] = implode(' ', $words);
}
Пример №1, без ссылок:
PHP:
$textKeyToWordToCnt = array();
foreach($texts as $textKey => $text)
{
$textKeyToWordToCnt[$textKey] = array();
$words = explode(' ', $text);
foreach($words as $word)
{
if(!array_key_exists($word, $textKeyToWordToCnt[$textKey]))
{
$textKeyToWordToCnt[$textKey][$word] = 0;
}
++$textKeyToWordToCnt[$textKey][$word];
}
}
перед началом генерации текстов: 28553844
перед началом обработки текстов: 61861172
после обработки текстов: 165037160
Пример №2, c ссылками:
PHP:
$h = array();
$textKeyToWordAndCnt = array();
foreach($texts as $textKey => $text)
{
$textKeyToWordAndCnt[$textKey] = array();
$words = explode(' ', $text);
$wordToCnt = array();
foreach($words as $word)
{
if(!array_key_exists($word, $wordToCnt))
{
$wordToCnt[$word] = 0;
}
++$wordToCnt[$word];
}
foreach($wordToCnt as $word => $cnt)
{
if(!array_key_exists($word, $h))
{
$h[$word] = $word;
}
$textKeyToWordAndCnt[$textKey][] = array(
&$h[$word], $cnt
);
}
}
Но результаты оказались иными:
перед началом генерации текстов: 28557252
перед началом обработки текстов: 61863696
после обработки текстов: 331917160
То есть стало использоваться в 2 раза больше памяти
Вопрос:
почему такое происходит ?