Огромные файлы

Тема в разделе "PHP", создана пользователем LEXAlForpostl, 4 авг 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Здравствуйте.
    Подскажите, пожалуйста, как считать файл 2 ГБ по-строчно.
    И к каждой строке применить функцию myfunc ().
     
    Iwashka нравится это.
  2. Belial

    Belial

    Регистр.:
    1 фев 2010
    Сообщения:
    236
    Симпатии:
    113
  3. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    по строкам 2 гига перебрал за 5 минут
    PHP:
    function myfunc($str){
        if(!
    preg_match('/blogs\.mail\.ru/i'$str)){
            return 
    false;
        }
        return 
    $str;
    }
    $in=fopen("blogs.txt","r");
    $out=fopen("blogs_out.txt","w");
    while(
    $line=fgets($in)){ 
        if(
    myfunc($line))fwrite($out$line);
    }
    fclose($in);
    fclose($out);
     
    Iwashka нравится это.
  4. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Странно. Не работает. Создаёт на выходе пустой файл.
    Необходимо найти все домены в зоне ру, на кождой строке, если они там есть.
    PHP:
    $in=fopen("a.txt","r");
    $out=fopen("b.txt","w");
    while(
    $line=fgets($in)){ 
    if (
    preg_match("|http:\/\/(.*?).ru|is"$str,$preg))
    fwrite($out$preg[1].".ru\n");

    }
    fclose($in);
    fclose($out); 
     
    Iwashka нравится это.
  5. t0os

    t0os

    Регистр.:
    21 окт 2007
    Сообщения:
    284
    Симпатии:
    36
    Нафига использовать регулярку на таком объеме данных?
     
  6. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Другого способа, для того, чтобы урлы выцепить не знаю.
     
  7. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    PHP:
    $in=fopen("a.txt","r");
    $out=fopen("b.txt","w");
    while(
    $line=fgets($in)){
    if (
    preg_match_all("|http:\/\/([^\/\s]*?)\.ru|is",$line,$preg)) {
    fwrite($out,join(".ru\n",$preg[1]).".ru\n");    
    } }
    fclose($in);
    fclose($out);
    без preg_match

    PHP:
    $in=fopen("a.txt","r");
    $out=fopen("b.txt","w");
    while(
    $line=fgets($in)){
    $line=strstr($line,"://") and $n=stripos($line,'ru') and
    $line=substr($line,3,$n-4) and fwrite($out,$line.".ru\n");
    }
    fclose($in);
    fclose($out);
     
    Iwashka нравится это.
  8. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Домен не в каждой строке есть.
    Если нет домена, то в файл ничего писать не надо.
     
    Iwashka нравится это.
  9. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Попробуй так: (экранировать точку забыл, и модификатор s там не понятно зачем.
    PHP:
    $in=fopen("a.txt","r");
    $out=fopen("b.txt","w");
    while(
    $line=fgets($in)){ 
    if (
    preg_match("|http\:\/\/(.*?)\.ru|i"$line,$preg))
    fwrite($out$preg[1].".ru\n");
    }
    fclose($in);
    fclose($out); 
    Ну и $str и $line не путай в следующий раз :)

    Добавлено через 2 минуты
    И кстати
    PHP:
    while($line fgets($in)) {
    оборвет цикл как только встретит пустую строку. Лучше уж по-старинке, через feof().. Ну то есть я к тому что конструкция эта чрезвычайно удобная, но пользоваться все же осторожно надо.
     
    Iwashka нравится это.
  10. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    На PHP забудь про такое. Для этого есть другие языки. Я писал на С++ и Ассемблере обработчик, а в php отдавал результат операции.
     
Статус темы:
Закрыта.