php подсчитываем количество дублей в файле и записываем в базу

php подсчитываем количество дублей в файле и записываем в базуРубрика: Новости -> Скрипты -> php
Пятница, 10 сентября 2010 г.
Просмотров: 6722
Настроение: неочень((, но надеюсь на лучшее
В колонках звучит: E-type - Angels crying [radio version]
Подписаться на комментарии по RSS

Думал долго как сделать нормальный подсчет количества повторений строк в файлах, удалять их дубли и писать сколько их было.

Написал простенький скрипт который ищет все дубли строк в одном файле и записывает их в другой файл в виде

строка1|количество дублей

строка2|количество дублей

..

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

поиск дублей происходит в циклах, и при больших объемах информации циклов становиться все больше и больше, но другого нормального решения для поиска дублей я ненашел((.

Есть какаято функция в php которая подсчитывает и выводит все дубли в массиве, но не в файле, а это значить что оперативная память будет хранить весь этот массив данных, что не есть гуд(.

кароче вот скрипт, я попробую еще ченить придумать как его оптимизировать под скорость, но пока идей нет((.

<?php
$fileopen = 'links.txt';//файл в котором будем искать дубли
$filesavebase = 'base.txt';//файл в который будем записывать все данные
            $links_file=fopen($fileopen, 'r');//открываем файл для сравнения с поиском
            $links_file_search=fopen($fileopen, 'r');//открываем файл для поиска
            $base_file=fopen($filesavebase, 'a+');//открываем файл для записи базы
            if ($links_file)
            {
                while(!feof($links_file))
                {
                    $data = trim(fgets($links_file));//переход к след строке сравнения с поиском
                    
        //поиск в базе
        fseek($base_file, 0);//сбрасываем указатель в файле базы на начало
        while(!feof($base_file))
        {
            $database = fgets($base_file);//переход к след строке базы
            //проверка на повторение с базой
            if (stristr($database,$data))
            {
            $goto='0';
            }
        }
//проверяем можем ли мы продожать или нет    
if($goto != '0'){
    //поиск повторений
    $counter = 0;
    while(!feof($links_file_search))
    {
    $str = fgets($links_file_search);
        if (stristr($str,$data))
        {
        $counter++;
        }
    }
    fseek($links_file_search, 0);//сбрасываем указатель в файле поиска на начало
//записываем в базу
$dataputs= trim($data).'|'. trim($counter)."\r\n";
fwrite($base_file, $dataputs);
          }
$goto='1';//переназначаем переменую
                 }
            }
//закрываем все открытые файлы
            fclose($links_file);
            fclose($links_file_search);
            fclose($base_file);
?>
если кто сможет оптимизировать код, либо показать готовый пример который будет лучше, то я буду очень рад).

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Комментариев: 2

  1. > если кто сможет оптимизировать код

    Надо предварительно строить индекс по первому (или первым n-символам).

    В этом случае при огромном файле он не будет проверять то, где точно нету ничего.

  2. Спсибо))), я учту если понадобится этот код использовать снова.

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

(войти без комментирования)

Имя и сайт используются только при регистрации

Если указать email (зарегистрироваться), то будет уведомление о новых комментариях.

Выберите человечка с поднятой рукой!