ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

19.12.2008, 14:20
|
|
Reservists Of Antichat - Level 6
Регистрация: 25.04.2008
Сообщений: 827
Провел на форуме: 2769640
Репутация:
1304
|
|
ss88, Naydav Омг, что за ужос вы пишете в час ночи?) Для больших файлов Бог давно придумал fgets и stream_get_line. fgets для построчного чтения, стрим - для любого разделителя
PHP код:
<pre><?php
$startTime=microtime(true);
set_time_limit(0);
$ss=0;
$hFile=fopen("dump2.txt","r");
$fileSize=filesize("dump2.txt");
echo "<b>Размер исходного файла:</b> ".($fileSize/1048576)."Mb<br/>";
while($buf=fgets($hFile,4096))
//while($buf=stream_get_line($hFile,4096,"*"))
{
$tmp=$buf;
$ss++;
}
fclose($hFile);
echo "Предпоследняя строка: ".$tmp."\r\n".'Количество прочитанных строк '.$ss."\r\n";
echo "<br/><b>Время затраченное на операцию: </b>".(microtime(true)-$startTime)." seconds";
?>
|
|
|

19.12.2008, 14:49
|
|
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
Провел на форуме: 298300
Репутация:
128
|
|
Сообщение от Gifts
ss88, Naydav Омг, что за ужос вы пишете в час ночи?) Для больших файлов Бог давно придумал fgets и stream_get_line. fgets для построчного чтения, стрим - для любого разделителя
изменил кое-что, но твой вариант со взятием каждой строки отдельно - это для больших файлов, конечно, самое оно, я не подумавши только что запустил такой вариант, уже минут 10 чиргыкает 100Мб...
Но кое-что я таки поменял, за что тебе спасиобо
PHP код:
<?php
$startTime=microtime(TRUE);//приблизительный замер времени начала
$db=mysql_connect("localhost","root","");
mysql_select_db("achat",$db);
//убираем лимит по времени и аборты от пользователя
set_time_limit(0);
ignore_user_abort(TRUE);
$currPos=0;//текущая позиция в байтах
$delimiter='*';
$hFile=fopen("dump.txt","rt");
$partSize=51200;//одна порция = 50Кб
$currPos=0;//текущая позиция в байтах, считая от начала файла
$fileSize=filesize("dump.txt");//размер файла
echo "<b>Размер исходного файла:</b> ".($fileSize/1048576)."Mb ({$fileSize}Bytes)<br/>";
//дочитыване до конца последней строки
while(!feof($hFile))
{//если осталось в файле меньше,чем на порцию
if($currPos+$partSize>$fileSize)
$partSize=$fileSize-$currPos;
//считывание порции определенного размера
$currentPartOfData=fread($hFile,$partSize);
$currPos+=$partSize;
/* если последний символ не разделитель строк, то нужно дочитать порцию до разделителя*/
if($currentPartOfData{strlen($currentPartOfData)-1}!=$delimiter)
{
$currentPartOfData.=$tmp=stream_get_line($hFile,$partSize,$delimiter);
$currPos+=strlen($tmp)-1;
}
/*НАГРУЗКА - разбить порцию на массив*/
$currentPartOfData=explode($delimiter,$currentPartOfData);
/*занесение значений в базу данных*/
foreach ($currentPartOfData as $string)
mysql_query("INSERT INTO gruz (str) VALUES('{$string}');",$db);
echo "#";
}
echo $currentPartOfData[count($currentPartOfData)-1]."<br/>";
fclose($hFile);
mysql_close($db);
echo "<br/>endPos={$currPos}<br/><b>Время затраченное на операцию: </b>".(microtime(TRUE)-$startTime)." seconds";
?>
кстати, теперь, когда окончание строки выдирается stream_get_line работает с такой же скоростью. А вот все таки вариант с построчным выдиранием - это не то ))) запусти такое у себя, когда файл из строк символов по 200-300, а сам файл метров 100-200, мне пришлось рестартить апач, чтобы эта медленная садистская вакханалия прекратилась. )))
Вобщем-то, закономерно, что, при уменьшении размера порции, увеличится время выполнения, но и нужно задуматься перед тем, как ставить ее больше одного Мб. Хотя наибольшего быстродействия чтение/разбиение я добился при размере порции 50Кб. 20Мб без занесения в БД обрабатывается 0,2с. Так что, уже стало ясно, по крайней мере мне, что при средних размерав дампов в 40-100Мб, операция их чтения/обработки/занесения в БД совсем даже и не критичны в таком контексте выполнения.
Последний раз редактировалось ss88; 19.12.2008 в 16:01..
|
|
|

19.12.2008, 16:33
|
|
Постоянный
Регистрация: 26.03.2008
Сообщений: 311
Провел на форуме: 3799424
Репутация:
479
|
|
мааленький вопрос. :-[
есть хеши с "мусором" вида 2008-08-18(43):3557d8eff41195a6e33efb18d356a3e5:::0
нужен только хеш
PHP код:
<?php
$op="filet.xt";
$file=file_get_contents($op) or die ("Cannot open file");
$exp=explode(":",$file);
echo $exp[1];
?>
запутался с циклом =\
и вообще оптимален ли такой вариант? или есть лучше
|
|
|

19.12.2008, 16:40
|
|
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
Провел на форуме: 298300
Репутация:
128
|
|
если размер файла превысит допустимые размеры на выделение памяти для переменных, то получишь
Fatal error: Allowed memory size of хххххх bytes exhausted (tried to allocate ххххх bytes)
|
|
|

19.12.2008, 17:22
|
|
Постоянный
Регистрация: 05.12.2004
Сообщений: 647
Провел на форуме: 1698585
Репутация:
818
|
|
#Wolf#,
есть хеши с "мусором" вида 2008-08-18(43):3557d8eff41195a6e33efb18d356a3e5:::0
нужен только хеш
PHP код:
<?php
$str = '2008-08-18(43):3557d8eff41195a6e33efb18d356a3e5::';
preg_match('#[0-9a-f]{32}#i',$str, $matches);
print_r($matches);
echo $matches[0];
?>
Это вопрос по части регулярок, задаються сюда)
http://forum.antichat.ru/thread92492.html
Последний раз редактировалось b3; 19.12.2008 в 17:27..
|
|
|

19.12.2008, 17:40
|
|
Участник форума
Регистрация: 19.02.2008
Сообщений: 186
Провел на форуме: 584540
Репутация:
96
|
|
Как из TEXTAREA все данные перекинуть массив (условие что каждый новый элемент с "\n");
Т.е. Есть TEXTAREA:
Первый
Второй
Должно быть
$mas[0]=Первый
$mas[1]=Второй.
Пробую так:
==========бла бла бла==========
<TEXTAREA name=all cols=45 rows=15></TEXTAREA><br>
==========бла бла бла==========
$array=array(split("\n",$_POST['all']));
==========бла бла бла==========
|
|
|

19.12.2008, 17:44
|
|
наркоман с медалью
Регистрация: 07.05.2005
Сообщений: 3,704
Провел на форуме: 19975136
Репутация:
4536
|
|
$array = explode("\n", $_POST['all']);
|
|
|

19.12.2008, 19:12
|
|
Познавший АНТИЧАТ
Регистрация: 05.05.2008
Сообщений: 1,078
Провел на форуме: 10311449
Репутация:
1357
|
|
Где можно скачать норм учебник по пхп с 0, так чтоб без лишнего и одним архивом?
|
|
|

19.12.2008, 19:18
|
|
Постоянный
Регистрация: 21.08.2007
Сообщений: 367
Провел на форуме: 3578960
Репутация:
468
|
|
http://www.php.net/download-docs.php
удачи=)
|
|
|

19.12.2008, 21:54
|
|
Участник форума
Регистрация: 12.03.2008
Сообщений: 254
Провел на форуме: 12333903
Репутация:
238
|
|
Может мой вопрос не сильно по теме,но как можно имитировать POST в ссылке,вопше делают так например
http://blablabla.ru/index.php&post=on
ето передается как бы в POST запросе переменная post со значением on вот только далекооо не всегда так выходит...подскажите плз...
|
|
|
|
 |
|
|
Здесь присутствуют: 9 (пользователей: 0 , гостей: 9)
|
|
|
|