Память / Оптимизация - PullRequest
1 голос
/ 15 мая 2009

Я работаю над сложным сценарием, который может обрабатывать до 500 000 записей. Вот мой вопрос.

В основном мой код будет анализировать текстовый файл, чтобы получить каждую из этих 500 000 записей или около того. Каждая запись будет иметь категорию, мой код должен будет проверить, была ли создана новая запись в таблице categories для этой категории во время этой конкретной обработки, и если нет, то она создаст эту запись.

Итак, у меня есть 2 варианта:

1) Я храню массив ключей => значений, содержащих имя категории и идентификатор, чтобы я мог сделать это:

if (array_key_exists($category,$allCategories))
   $id=$allCategories[$category];
else
{
   mysql_query("INSERT INTO categories (procId,category) 
                       VALUES ('$procId''$category')");
   $id=mysql_insert_id();
   $allCategories[$category]=$id;
}

2) Каждый раз, когда этот текстовый файл обрабатывается, он получает свой собственный идентификатор процесса. Поэтому вместо проверки переменной $allCategories, которая может вырасти до 100 000 записей, я мог бы сделать это:

SELECT id FROM categories WHERE procId='$procId' AND category='$category'

Недостатком здесь является то, что этот запрос будет выполняться для каждой из 500 000 записей. Принимая во внимание, что недостатком хранения всех категорий в массиве является то, что у меня может быть недостаточно памяти или сервер может аварийно завершить работу.

Есть мысли?

Ответы [ 3 ]

2 голосов
/ 15 мая 2009

Можете ли вы просто сохранить список идентификаторов, которые вы уже вставили? Если они являются целочисленными идентификаторами, то это 4 байта каждый раз, когда 100 000 записей будут использовать только около 400 КБ памяти.

ETA:

Чтобы избежать сохранения имени категории, хешируйте имя и сохраняйте хэш. При использовании 128-битного MD5-хэша это 16 байтов на хэш или только около 1,6 МБ памяти + накладные расходы.

1 голос
/ 15 мая 2009

Учитывая, что ваше среднее имя категории составляет 30 байт, вам потребуется всего 30 * 500000 байт = 15000000 байт = 15000 килобайт = 1,5 мегабайт.

Я думаю, у тебя столько памяти.

1 голос
/ 15 мая 2009

Одной из идей будет добавление ограничения на таблицу, чтобы дубликаты вставок были отклонены базой данных. Затем просто продолжайте вставлять все записи и дайте БД выполнить проверку.

...