[php] Новичкам: задаем вопросы

Discussion in 'PHP' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. Naydav

    Naydav Elder - Старейшина

    Joined:
    30 Dec 2006
    Messages:
    439
    Likes Received:
    63
    Reputations:
    4
    Т.е что -то типа
    - открыл файл
    - считал инфу до переноса строки
    - запомнил позицию

    но после скажем 300 000 - ой строки,
    нам при новом обращении к файлу, нужно будет осчитывать 300 000 переносов строк, пот 300 001, 300 002 и т.д.

    ну это еще медленней чем file

    Или как запоминать позицыю строки? приведи пример хотя бы на файле в 10 строк

    ---------
    смотрю с fseek
    при использовании fseek, нужно ЕЩЕ вычислять размер КАЖДОЙ считанной строки, что бы знать куда потом вернутся + алгоритм считывание новой строки до символа переноса строки( именно не побайтово, а до переноса строки) = еще медленее, вернее вообще хреново...

    Чем больше вариантов пробую, тем убеждаюсь - не нужно изобретать велосипед - file()

    но вариант был интересный :)
     
    #6881 Naydav, 19 Dec 2008
    Last edited: 19 Dec 2008
  2. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    щаз приведу
     
  3. Naydav

    Naydav Elder - Старейшина

    Joined:
    30 Dec 2006
    Messages:
    439
    Likes Received:
    63
    Reputations:
    4
    Да все же уже, не нужно
    я не увидел твой пост после редактирования, отписался выше
     
  4. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    PHP:
    <?php
        $currPos
    =0;
        
    $hFile=fopen("dump.txt","r");
        
    //считывание порции определенного размера
        
    $currentPartOfData=fread($hFile,4096);
        
    $currPos+=4096;
        
    //дочитыване до конца последней строки
        
    do
        {
            
    $currPos++;
            
    $currentPartOfData.=$byte=fread($hFile,1);
        }
        while(
    $byte!='\n')
    ?>
    Сырой и толком непродуманный пример считывания порции из твоего файла, после обработки текущей порции, считывание продолжается оттуда, где мы закончили и читается следующая порция... Нужно учитывать длину файла. Собственно, вот, это будет лучше, чем забить несколько файлов по полгектара в память
     
    #6884 ss88, 19 Dec 2008
    Last edited: 19 Dec 2008
  5. Naydav

    Naydav Elder - Старейшина

    Joined:
    30 Dec 2006
    Messages:
    439
    Likes Received:
    63
    Reputations:
    4
    Спасибо, на скорую руку, как я писал уже,
    работает медленней чем file, но пища для размышленний есть!!!
    еще раз спасибо!
     
  6. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Для долбиков в оправдание моего мега-метода, придуманного налету:)

    Разрезаем файл на части указанной выше программой, получаем что-то типо вроде:

    sql.0, sql.1 - ну это если на две части. А дальше такой код:

    PHP:
    <?
    for(
    $i=0;$i<2;$i++) $p[$i]=File("sql." $i);
    print_r ($p);
    ?>
     
    #6886 Pashkela, 19 Dec 2008
    Last edited: 19 Dec 2008
  7. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    Ну дык, конечно же медленнее, вместо того, чтобы одним махом прочитать 300Мб, дергать винт за каждой порцией... Здесь просто нужно еще найти среднепривлекательный размер этих порций, тогда задержка, вызванная работой с диском уменьшится... Я думаю, порции порядка 20-30Мб - вполне приемлемы... Главное, потом сделать более или менее оптимальный алгоритм разбора полученного массива, чтобы он не делал лишних действий и беганий...
     
  8. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    Ну и чем это лучше??? Если мы работаем с порциями то последовательно сможем дочитывать то, чего нам не хватило, а если есть твои два файла и получился разрыв строки между ними, что тогда?
     
  9. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    2 ss88:

    твой алгоритм заткнется или будет мега тормозить еще здесь:)

    PHP:
     $hFile=fopen("dump.txt","r");
    если действительно 70мб

    тоже самое, что и с последовательными строками в массиве. Мозги включайте уже, да. Может мне вам вообще еще 10 000$ подарить?:)
     
  10. Naydav

    Naydav Elder - Старейшина

    Joined:
    30 Dec 2006
    Messages:
    439
    Likes Received:
    63
    Reputations:
    4
    Послушай, мало что, что ты не можешь прочесть то, что я писал выше (хотя я раза три просил тебе сделать), ты начинаешь еще и хамить!!!


    Naydav писал:
    Или я должен сказать, заказчику, что его система(за нехилые бабки) не будет работать, пока он не установит себе прогу и не будет резать файлы, о которых он и не догадывается, ах да и еще пусть всех кто будет работать(а это банковские работники - во многом люди далекие от йти) тоже пусть разбираются и ставят софт... (кстати даже файл на сервак загружается по фтп удаллено зазипованым, но я думаю они его скачают порежут, зальют все обратно - тьху ты делов то, пАдумаешь)

    И обновление только с винды, хотя есть четкая постановка, один из вариантов запуска на обновление при смс с мобильника,

    о скажи а для телефона этой проги нету случайно?
     
    #6890 Naydav, 19 Dec 2008
    Last edited: 19 Dec 2008
  11. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    2 Naydav:

    Веселитесь дальше:)
     
  12. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    Чувак, ты зря корчишь тут мегагуру и оскорбляешь присутствующих.
    Насчет, "заткнется", скажу тебе только то, что тебе бы мозги иногда включать, перед тем, как что-то писать, потому что открывается только хэндл, и пофиг, сколько весит файл, ты заронил в мне сомнение, я только что проверил
    PHP:
    $hFile=fopen("ZendStudioForEclipse-6_1_0.tar.gz","r");
        echo 
    "AllRight";
        
    fclose($hFile);
    Работает это без всяких задержек(студия весит 350Мб), что доказывать, вобщем-то, и не стояло. А хамство применяется немного в других местах.
    Насчет "долбиков"... чтение порции с дочитыванием займет, конечно, чуть бульше времени, чем чтение файла целиком, но сколько потом займет времени и как усложнит алгоритм согласование между порезанными частями? Или ты еще и резать их предлагаешь по правилам?
     
    #6892 ss88, 19 Dec 2008
    Last edited: 19 Dec 2008
  13. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Да не вопрос, оставляю вас наедине, девочки:)) Читайте хоть гигабайтнгые файлы таким макаром:)
     
    1 person likes this.
  14. Naydav

    Naydav Elder - Старейшина

    Joined:
    30 Dec 2006
    Messages:
    439
    Likes Received:
    63
    Reputations:
    4
    В новой версии (2.1) (02.05.2002)

    Скажи а ты прогу скачивал, ты вообще смотрел что в архиве? я вроде постом выше отписал почему немогу использовать софт, который режет файлы на части(у пользователя, тои достып к файлам-то нету),

    неужели непонятно, о чем я написал постом выше... ???
    Все извини, но я не хочу тратить свое время, ты все рано ответишь
     
    #6894 Naydav, 19 Dec 2008
    Last edited: 19 Dec 2008
  15. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Файловый резак, причем с исходниками:
    http://old.softerra.ru/softnews/2002/5/6/20594/

    Красненькое видишь? Нет? Ты дальтоник?

    Ссылка рабочая, сам скачал, порезал свой дамп весом в 43 мб на части и спокойно всё загнал в массив - алгоритм выше.

    ЗЫЖ Вот тупицы оба-два:)
     
  16. Naydav

    Naydav Elder - Старейшина

    Joined:
    30 Dec 2006
    Messages:
    439
    Likes Received:
    63
    Reputations:
    4
    смотрю в книгу - вижу фигу, ну прочти еще раз

    http://forum.antichat.ru/showpost.php?p=1002163&postcount=7153

    пс Не было ни единого разрыва!!! :)
     
    #6896 Naydav, 19 Dec 2008
    Last edited: 19 Dec 2008
  17. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    2 Naydav:

    Ты реально тупой, извини. Хоть бы для начала попробовал бы сделать - запустить прогу, порезать, понять принцип работы, увидеть, что там есть даже .bat файл, который всё это склеит обратно, что там есть исходники, которые можно почитать, изучить и понять алгоритм - нет, сразу аврал, "Мне не то предлагают, чо за нахер!!!". С таким подходом иди коз доить, а не совета спрашивай, уважаемый

    ЗЫЖ Задание твоё я 100 000 раз прочитал, и там, кроме того, что тебе прислали дамп весом неимоверным, и тебе надо загнать всё его в содержимое в массив, желательно посредством file(), а потом вставлять в таблицы и прочее (не важно дальше что, на самом деле) - так вот, именно эту задачу я и решил, а все твои последующие "банки, хренанки и прочее "хамство" - просто лол ходячий. Больше не слова.
     
  18. Naydav

    Naydav Elder - Старейшина

    Joined:
    30 Dec 2006
    Messages:
    439
    Likes Received:
    63
    Reputations:
    4
    Я тебе сразу ответил, что порезать файл по таблицам я могу и вручную, БЕЗ ВСЯКИХ ПРОГ
    и в шестой раз
    http://forum.antichat.ru/showpost.php?p=1002163&postcount=7153
    указываю на причину, почему это не подходит
    но я понял, что с тобой это бесполезно

    Почему в каждом твоем обращении(долбики, девочки, тупицы, дальтоник, тупой, лол) - присутствует оскорбление?
    Это у тебя такая модель поведения или уровень развития?
    пс
    Надеюсь к утру тут почистят :)
     
    #6898 Naydav, 19 Dec 2008
    Last edited: 19 Dec 2008
  19. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Ну ладно, извини, просто эмоции так и прут. Почему тебе такой метод не подойдет, я так и не понял. Наверное тупой таки я. Peace.
     
  20. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    Вобщем, чего я наисследовал. Привожу два скрипта, 1-й создает файл забитый одинаковыми строками (чтобы было над чем работать), 2-й его последовательно читает порциами по 1Мб, если раскоментируете работу с БД, то еще и заносить в базу будет.
    makefile.php
    PHP:
    <?php
    //через $_GET['s'] задается размер файла в Мб
        
    set_time_limit(0);
        
    ignore_user_abort(TRUE);
        
    $floodString="1766 1 154 2005-02-01 00:00:00.000 NULL 2 10692.6800 8264.4285 *";
        
    $hFile=fopen("dump.txt","w");
        if(
    is_numeric($_GET['s']))
            
    $size=$_GET['s']*1024*1024;
        else
            
    $size=70*1024*1024;
        
    $size=$size/strlen($floodString);
        for(
    $i=0;$i<$size;$i++)
            
    fwrite($hFile,$floodString);
        
    fclose($hFile);
        echo 
    "Файл успешно создан";
    ?>
    testing.php
    PHP:
    <?php
        $startTime
    =time();//приблизительный замер времени начала
        //$db=mysql_connect("localhost","root","");
        //mysql_select_db("achat",$db);
        //убираем лимит по времени и аборты от пользователя
        
    set_time_limit(0);
        
    ignore_user_abort(TRUE);
        
    $currPos=0;//текущая позиция в байтах
        
    $hFile=fopen("dump.txt","rt");
        
    $partSize=1048576;//одна порция = 1Мб
        
    $currPos=0;//текущая позиция в байтах, считая от начала файла
        
    $fileSize=filesize("dump.txt");//размер файла
        
    echo "<b>Размер исходного файла:</b> ".($fileSize/1048576)."Mb<br/>";
        
    //дочитыване до конца последней строки
        
    while($currPos<$fileSize)
        {
    //если осталось в файле меньше,чем на порцию
            
    if($currPos+$partSize>$fileSize)
                
    $partSize=$fileSize-$currPos;
            
    //считывание порции определенного размера
            
    $currentPartOfData=fread($hFile,$partSize);
            
    $currPos+=$partSize
            
    /* если последний символ не разделитель строк, то нужно дочитать порцию до разделителя*/
            
    if($currentPartOfData{strlen($currentPartOfData)-1}!='*'
                do
                {
                    
    $currPos++;
                    
    $currentPartOfData.=$byte=fread($hFile,1);
                }
                while(
    $byte!='*');
            
    /*НАГРУЗКА - разбить порцию на массив*/
            
    $currentPartOfData=explode("*",$currentPartOfData);
            
    /*занесение значений в базу данных*/
            //foreach ($currentPartOfData as $string)
                //mysql_query("INSERT INTO gruz (str) VALUES('{$string}');",$db);
            
    echo "<br/><b>Обработано: </b>".($currPos/1048576)."Mb";
        }
        
    fclose($hFile);
        
    //mysql_close($db);
        
    echo "<br/><b>Время затраченное на операцию: </b>".(time()-$startTime)." seconds";
    ?>
    Прошу всех, кому не лень, потестить эти вещи, благо - телодвижений для этого сильно много не нужно.
    Вобщем, что получается, файл размером 120Мб обрабатывается без занесения в базу 2-3с. (комп. у меня совсем неважняцкий, а жаль, но надо будет это поправить :) ). Если еще и заносить эти 120Мб в базу, то обходится это уже в 76секунд. Как видишь, спор о быстродействии чтения из файла исчерпывается, теперь уже встает вопрос об оптимизации работы с базой, но это не было самоцелью.
    Так что не нужно дамп бить на части, тем-более, что чтение+explod'ы даже 1Гб дампа (такого у тебя уж точно не будет) заняло всего 9секунд.
    Потесть у себя на компе, это, конечно, только кусок моего быдлокода, но все же вопрос актуальный и интересный.
     
Thread Status:
Not open for further replies.