ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #7121  
Старый 19.12.2008, 14:20
Gifts
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";
?>
 
Ответить с цитированием

  #7122  
Старый 19.12.2008, 14:49
ss88
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
Провел на форуме:
298300

Репутация: 128
Отправить сообщение для ss88 с помощью ICQ
Wink

Цитата:
Сообщение от 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..
 
Ответить с цитированием

  #7123  
Старый 19.12.2008, 16:33
#Wolf#
Постоянный
Регистрация: 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];
?>
запутался с циклом =\
и вообще оптимален ли такой вариант? или есть лучше
 
Ответить с цитированием

  #7124  
Старый 19.12.2008, 16:40
ss88
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
Провел на форуме:
298300

Репутация: 128
Отправить сообщение для ss88 с помощью ICQ
По умолчанию

если размер файла превысит допустимые размеры на выделение памяти для переменных, то получишь
Fatal error: Allowed memory size of хххххх bytes exhausted (tried to allocate ххххх bytes)
 
Ответить с цитированием

  #7125  
Старый 19.12.2008, 17:22
b3
Постоянный
Регистрация: 05.12.2004
Сообщений: 647
Провел на форуме:
1698585

Репутация: 818


Отправить сообщение для b3 с помощью ICQ
По умолчанию

#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..
 
Ответить с цитированием

  #7126  
Старый 19.12.2008, 17:40
$p01nt
Участник форума
Регистрация: 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']));
==========бла бла бла==========
 
Ответить с цитированием

  #7127  
Старый 19.12.2008, 17:44
GreenBear
наркоман с медалью
Регистрация: 07.05.2005
Сообщений: 3,704
Провел на форуме:
19975136

Репутация: 4536


Отправить сообщение для GreenBear с помощью ICQ
По умолчанию

$array = explode("\n", $_POST['all']);
 
Ответить с цитированием

  #7128  
Старый 19.12.2008, 19:12
MaTpOc
Познавший АНТИЧАТ
Регистрация: 05.05.2008
Сообщений: 1,078
Провел на форуме:
10311449

Репутация: 1357


По умолчанию

Где можно скачать норм учебник по пхп с 0, так чтоб без лишнего и одним архивом?
 
Ответить с цитированием

  #7129  
Старый 19.12.2008, 19:18
life_is_shit
Постоянный
Регистрация: 21.08.2007
Сообщений: 367
Провел на форуме:
3578960

Репутация: 468
Отправить сообщение для life_is_shit с помощью ICQ
По умолчанию

http://www.php.net/download-docs.php
удачи=)
 
Ответить с цитированием

  #7130  
Старый 19.12.2008, 21:54
Mixon
Участник форума
Регистрация: 12.03.2008
Сообщений: 254
Провел на форуме:
12333903

Репутация: 238
Отправить сообщение для Mixon с помощью ICQ
По умолчанию

Может мой вопрос не сильно по теме,но как можно имитировать POST в ссылке,вопше делают так например

http://blablabla.ru/index.php&post=on

ето передается как бы в POST запросе переменная post со значением on вот только далекооо не всегда так выходит...подскажите плз...
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[c/c++] Новичкам: задаем вопросы _Great_ С/С++, C#, Delphi, .NET, Asm 5420 17.06.2010 13:33
Интернетчики задали российскому президенту очень странные вопросы podkashey Мировые новости 4 07.07.2006 16:53
Вопросы по Ipb 2.0 Voodoo_People Форумы 26 15.02.2005 22:57



Здесь присутствуют: 9 (пользователей: 0 , гостей: 9)
 


Быстрый переход




ANTICHAT.XYZ