Т.е что -то типа - открыл файл - считал инфу до переноса строки - запомнил позицию но после скажем 300 000 - ой строки, нам при новом обращении к файлу, нужно будет осчитывать 300 000 переносов строк, пот 300 001, 300 002 и т.д. ну это еще медленней чем file Или как запоминать позицыю строки? приведи пример хотя бы на файле в 10 строк --------- смотрю с fseek при использовании fseek, нужно ЕЩЕ вычислять размер КАЖДОЙ считанной строки, что бы знать куда потом вернутся + алгоритм считывание новой строки до символа переноса строки( именно не побайтово, а до переноса строки) = еще медленее, вернее вообще хреново... Чем больше вариантов пробую, тем убеждаюсь - не нужно изобретать велосипед - file() но вариант был интересный
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') ?> Сырой и толком непродуманный пример считывания порции из твоего файла, после обработки текущей порции, считывание продолжается оттуда, где мы закончили и читается следующая порция... Нужно учитывать длину файла. Собственно, вот, это будет лучше, чем забить несколько файлов по полгектара в память
Спасибо, на скорую руку, как я писал уже, работает медленней чем file, но пища для размышленний есть!!! еще раз спасибо!
Для долбиков в оправдание моего мега-метода, придуманного налету Разрезаем файл на части указанной выше программой, получаем что-то типо вроде: sql.0, sql.1 - ну это если на две части. А дальше такой код: PHP: <? for($i=0;$i<2;$i++) $p[$i]=File("sql." . $i); print_r ($p); ?>
Ну дык, конечно же медленнее, вместо того, чтобы одним махом прочитать 300Мб, дергать винт за каждой порцией... Здесь просто нужно еще найти среднепривлекательный размер этих порций, тогда задержка, вызванная работой с диском уменьшится... Я думаю, порции порядка 20-30Мб - вполне приемлемы... Главное, потом сделать более или менее оптимальный алгоритм разбора полученного массива, чтобы он не делал лишних действий и беганий...
Ну и чем это лучше??? Если мы работаем с порциями то последовательно сможем дочитывать то, чего нам не хватило, а если есть твои два файла и получился разрыв строки между ними, что тогда?
2 ss88: твой алгоритм заткнется или будет мега тормозить еще здесь PHP: $hFile=fopen("dump.txt","r"); если действительно 70мб тоже самое, что и с последовательными строками в массиве. Мозги включайте уже, да. Может мне вам вообще еще 10 000$ подарить?
Послушай, мало что, что ты не можешь прочесть то, что я писал выше (хотя я раза три просил тебе сделать), ты начинаешь еще и хамить!!! Naydav писал: Или я должен сказать, заказчику, что его система(за нехилые бабки) не будет работать, пока он не установит себе прогу и не будет резать файлы, о которых он и не догадывается, ах да и еще пусть всех кто будет работать(а это банковские работники - во многом люди далекие от йти) тоже пусть разбираются и ставят софт... (кстати даже файл на сервак загружается по фтп удаллено зазипованым, но я думаю они его скачают порежут, зальют все обратно - тьху ты делов то, пАдумаешь) И обновление только с винды, хотя есть четкая постановка, один из вариантов запуска на обновление при смс с мобильника, о скажи а для телефона этой проги нету случайно?
Чувак, ты зря корчишь тут мегагуру и оскорбляешь присутствующих. Насчет, "заткнется", скажу тебе только то, что тебе бы мозги иногда включать, перед тем, как что-то писать, потому что открывается только хэндл, и пофиг, сколько весит файл, ты заронил в мне сомнение, я только что проверил PHP: $hFile=fopen("ZendStudioForEclipse-6_1_0.tar.gz","r"); echo "AllRight"; fclose($hFile); Работает это без всяких задержек(студия весит 350Мб), что доказывать, вобщем-то, и не стояло. А хамство применяется немного в других местах. Насчет "долбиков"... чтение порции с дочитыванием займет, конечно, чуть бульше времени, чем чтение файла целиком, но сколько потом займет времени и как усложнит алгоритм согласование между порезанными частями? Или ты еще и резать их предлагаешь по правилам?
В новой версии (2.1) (02.05.2002) Скажи а ты прогу скачивал, ты вообще смотрел что в архиве? я вроде постом выше отписал почему немогу использовать софт, который режет файлы на части(у пользователя, тои достып к файлам-то нету), неужели непонятно, о чем я написал постом выше... ??? Все извини, но я не хочу тратить свое время, ты все рано ответишь
Файловый резак, причем с исходниками: http://old.softerra.ru/softnews/2002/5/6/20594/ Красненькое видишь? Нет? Ты дальтоник? Ссылка рабочая, сам скачал, порезал свой дамп весом в 43 мб на части и спокойно всё загнал в массив - алгоритм выше. ЗЫЖ Вот тупицы оба-два
смотрю в книгу - вижу фигу, ну прочти еще раз http://forum.antichat.ru/showpost.php?p=1002163&postcount=7153 пс Не было ни единого разрыва!!!
2 Naydav: Ты реально тупой, извини. Хоть бы для начала попробовал бы сделать - запустить прогу, порезать, понять принцип работы, увидеть, что там есть даже .bat файл, который всё это склеит обратно, что там есть исходники, которые можно почитать, изучить и понять алгоритм - нет, сразу аврал, "Мне не то предлагают, чо за нахер!!!". С таким подходом иди коз доить, а не совета спрашивай, уважаемый ЗЫЖ Задание твоё я 100 000 раз прочитал, и там, кроме того, что тебе прислали дамп весом неимоверным, и тебе надо загнать всё его в содержимое в массив, желательно посредством file(), а потом вставлять в таблицы и прочее (не важно дальше что, на самом деле) - так вот, именно эту задачу я и решил, а все твои последующие "банки, хренанки и прочее "хамство" - просто лол ходячий. Больше не слова.
Я тебе сразу ответил, что порезать файл по таблицам я могу и вручную, БЕЗ ВСЯКИХ ПРОГ и в шестой раз http://forum.antichat.ru/showpost.php?p=1002163&postcount=7153 указываю на причину, почему это не подходит но я понял, что с тобой это бесполезно Почему в каждом твоем обращении(долбики, девочки, тупицы, дальтоник, тупой, лол) - присутствует оскорбление? Это у тебя такая модель поведения или уровень развития? пс Надеюсь к утру тут почистят
Ну ладно, извини, просто эмоции так и прут. Почему тебе такой метод не подойдет, я так и не понял. Наверное тупой таки я. Peace.
Вобщем, чего я наисследовал. Привожу два скрипта, 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секунд. Потесть у себя на компе, это, конечно, только кусок моего быдлокода, но все же вопрос актуальный и интересный.