HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

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

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

  #7111  
Старый 19.12.2008, 02:52
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме:
9220514

Репутация: 3338


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

Ну ладно, извини, просто эмоции так и прут. Почему тебе такой метод не подойдет, я так и не понял. Наверное тупой таки я. Peace.
 
Ответить с цитированием

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

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

Цитата:
Сообщение от Naydav  
Я тебе сразу ответил, что порезать файл по таблицам я могу и вручную, БЕЗ ВСЯКИХ ПРОГ
и в шестой раз
....
Вобщем, чего я наисследовал. Привожу два скрипта, 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секунд.
Потесть у себя на компе, это, конечно, только кусок моего быдлокода, но все же вопрос актуальный и интересный.
 
Ответить с цитированием

  #7113  
Старый 19.12.2008, 10:53
imajo.ati
Участник форума
Регистрация: 21.02.2008
Сообщений: 255
Провел на форуме:
975514

Репутация: 177
По умолчанию

вопрос:
функция exec или system запускает файл и ждёт пока он полностью не выполнится.
есть ли функция, которая не будет ждать выполнения и позволит продолжить работу?
 
Ответить с цитированием

  #7114  
Старый 19.12.2008, 11:04
Namelles One
Познающий
Регистрация: 08.07.2005
Сообщений: 47
Провел на форуме:
149096

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

Запускать файл - это сильно...

Запускай с помощью нее, но - с отвязкой от консоли (хотя, конечно, в PHP происходящее сложно назвать консолью), то есть - с амперсандом ( & ) после команды.
 
Ответить с цитированием

  #7115  
Старый 19.12.2008, 11:07
imajo.ati
Участник форума
Регистрация: 21.02.2008
Сообщений: 255
Провел на форуме:
975514

Репутация: 177
По умолчанию

Цитата:
Сообщение от Namelles One  
Запускать файл - это сильно...

Запускай с помощью нее, но - с отвязкой от консоли (хотя, конечно, в PHP происходящее сложно назвать консолью), то есть - с амперсандом ( & ) после команды.
запустил с амперсандом

по-прежнему ждёт выполнения файла и не продолжает работу скрипта

exec('php d:/dev.php &');
 
Ответить с цитированием

  #7116  
Старый 19.12.2008, 11:18
oRb
Members of Antichat - Level 5
Регистрация: 09.05.2008
Сообщений: 304
Провел на форуме:
7875940

Репутация: 2362
По умолчанию

Цитата:
Сообщение от imajo.ati  
запустил с амперсандом

по-прежнему ждёт выполнения файла и не продолжает работу скрипта

exec('php d:/dev.php &');
Так это винда, а не линукс. Здесь такое не прокатит.
 
Ответить с цитированием

  #7117  
Старый 19.12.2008, 11:44
Namelles One
Познающий
Регистрация: 08.07.2005
Сообщений: 47
Провел на форуме:
149096

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

ОМФГ.

Ну откуда мне знатЬ, что ты под Виндой сидишь.

Резонный вопрос - у тебя и так исполняется php код. Зачем из php кода вызывать исполнение php кода - не проще ли вставить? Хотя, тебе, судя по всему - потоков в php не хватает, читай про реализации псевдомногопоточности, по слухам оч клевых вещей люди на основе оной добиваются.
 
Ответить с цитированием

  #7118  
Старый 19.12.2008, 11:56
groundhog
Познавший АНТИЧАТ
Регистрация: 12.05.2007
Сообщений: 1,235
Провел на форуме:
2238549

Репутация: 1318


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

Неймлесс прав, в винде нормально не демонизируешь скрипт и не оторвёшься от консоли... Если нужна многопоточность вот тут есть интересная её реализация, правда крайне экспериментальная...

http://github.com/danhen/php_threads/tree/master
 
Ответить с цитированием

  #7119  
Старый 19.12.2008, 13:39
imajo.ati
Участник форума
Регистрация: 21.02.2008
Сообщений: 255
Провел на форуме:
975514

Репутация: 177
По умолчанию

многопоточность в ПХП мне не нужна.
мне нужно 2 параллельно работающих скрипта в многопоточной операционной системе.

т.е. 2 раза запустить php.exe с параметром. но не вручную а с помощью кода на пхп

если невозможно - очень жаль, я в унынии(

Последний раз редактировалось imajo.ati; 19.12.2008 в 13:42..
 
Ответить с цитированием

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

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

Цитата:
Сообщение от ss88  
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";
?>
Обработка файла размером 300Мб с занесением в БД 4,915,500 записей заняло 377секунд. Неплохой результат, учитывая то, что размер порции не слишком большой. Здесь есть риск вызвать Fatal Error выделения памяти при больших порциях.
Я думаю, для подобных операций, которые, я думаю, выполняются нечасто, такой подход вполне приемлим.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[c/c++] Новичкам: задаем вопросы _Great_ С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby 5421 21.04.2026 07:37
Интернетчики задали российскому президенту очень странные вопросы podkashey Мировые новости. Обсуждения. 4 07.07.2006 16:53
Вопросы по Ipb 2.0 Voodoo_People Уязвимости CMS / форумов 26 15.02.2005 22:57



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


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




ANTICHAT.XYZ