Поиск дубликатов и добавление массивов в массив с миллионами массивов - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть около 2-5 миллионов массивов для поиска каждый день, и я пытаюсь отсеять дубликаты, но поиск их занимает довольно много времени, и по мере роста объекта это занимает все больше и больше времени.Я не знаю внутренности массива в PHP, и вместо того, чтобы взламывать кодовую базу, я надеялся, что кто-нибудь может дать мне несколько советов.Это суть основного цикла.

$duplicates = array();

foreach ($records as $record) {
    $duplicates = $this->increment_field($duplicates, $record,'id');
}

И он генерирует массив $ дубликатов.Работа выполняется в этой функции.

public function increment_field($placeholder_array, $record, $field_name) {

    if (isset($record[$field_name])) {
        if (!isset($placeholder_array[$record[$field_name]])) {
            $placeholder_array[$record[$field_name]] = array($record);
        } else {
            $placeholder_array[$record[$field_name]][] = $record;
        }
    }

    return $placeholder_array;
}

Будем весьма благодарны за любые предложения по оптимизации производительности.

Пример входящих данных:

$record = array(
 "id" => 123456678,
 "employee_first_name" => "Jane",
 "employee_last_name" => "Doe",
 "manager_first_name" => "John",
 "manager_last_name" => "Doe",
 "office_id" => 1234,
 "created_at" => '2018-11-29 07:59:02',
 "client_ip_address" => 2130706433,
 "server_ip_address" => 2130706532,
);

Система создает файл CSV для вывода и анализа в этом формате.

id,office_id,created_at,client_ip_address,server_ip_address,original_id
123456678,1234,'2018-11-29 07:59:02',2130706433,2130706532,123456678
123456679,1235,'2018-11-29 08:59:02',2130706433,2130706532,123456678
123456680,1236,'2018-11-29 09:59:02',2130706433,2130706532,123456678
123456681,1237,'2018-11-29 10:59:02',2130706433,2130706532,123456678
123456682,1238,'2018-11-29 11:59:02',2130706433,2130706532,123456678
123456683,1239,'2018-11-29 12:59:02',2130706433,2130706532,123456678

1 Ответ

0 голосов
/ 03 декабря 2018

Использование функции убивает представление.Вы дублируете массив, когда вам это не нужно.Если вы переместите этот код в строку, он сломается.Я протестировал его с 10 миллионами массивов по 1 МБ и смог завершить анализ за 2 минуты, когда код был встроен, и он все еще работает, когда я тестировал код в функции.Это не совсем то, что вы ищете, но если вам нужна производительность, это решение.Как говорит Ларри Уоллс: «Есть несколько способов сделать это».

$duplicates = array();

foreach ($records as $record) {

    if (isset($record['id'])) {
        if (!isset($duplicates[$record['id']])) {
            $duplicates[$record['id']] = array($record);
        } else {
            $duplicates[$record['id']][] = $record;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...