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

19.12.2008, 02:52
|
|
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме: 9220514
Репутация:
3338
|
|
Ну ладно, извини, просто эмоции так и прут. Почему тебе такой метод не подойдет, я так и не понял. Наверное тупой таки я. Peace.
|
|
|

19.12.2008, 04:42
|
|
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
Провел на форуме: 298300
Репутация:
128
|
|
Сообщение от 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секунд.
Потесть у себя на компе, это, конечно, только кусок моего быдлокода, но все же вопрос актуальный и интересный.
|
|
|

19.12.2008, 10:53
|
|
Участник форума
Регистрация: 21.02.2008
Сообщений: 255
Провел на форуме: 975514
Репутация:
177
|
|
вопрос:
функция exec или system запускает файл и ждёт пока он полностью не выполнится.
есть ли функция, которая не будет ждать выполнения и позволит продолжить работу?
|
|
|

19.12.2008, 11:04
|
|
Познающий
Регистрация: 08.07.2005
Сообщений: 47
Провел на форуме: 149096
Репутация:
65
|
|
Запускать файл - это сильно...
Запускай с помощью нее, но - с отвязкой от консоли (хотя, конечно, в PHP происходящее сложно назвать консолью), то есть - с амперсандом ( & ) после команды.
|
|
|

19.12.2008, 11:07
|
|
Участник форума
Регистрация: 21.02.2008
Сообщений: 255
Провел на форуме: 975514
Репутация:
177
|
|
Сообщение от Namelles One
Запускать файл - это сильно...
Запускай с помощью нее, но - с отвязкой от консоли (хотя, конечно, в PHP происходящее сложно назвать консолью), то есть - с амперсандом ( & ) после команды.
запустил с амперсандом
по-прежнему ждёт выполнения файла и не продолжает работу скрипта
exec('php d:/dev.php &');
|
|
|

19.12.2008, 11:18
|
|
Members of Antichat - Level 5
Регистрация: 09.05.2008
Сообщений: 304
Провел на форуме: 7875940
Репутация:
2362
|
|
Сообщение от imajo.ati
запустил с амперсандом
по-прежнему ждёт выполнения файла и не продолжает работу скрипта
exec('php d:/dev.php &');
Так это винда, а не линукс. Здесь такое не прокатит.
|
|
|

19.12.2008, 11:44
|
|
Познающий
Регистрация: 08.07.2005
Сообщений: 47
Провел на форуме: 149096
Репутация:
65
|
|
ОМФГ.
Ну откуда мне знатЬ, что ты под Виндой сидишь.
Резонный вопрос - у тебя и так исполняется php код. Зачем из php кода вызывать исполнение php кода - не проще ли вставить? Хотя, тебе, судя по всему - потоков в php не хватает, читай про реализации псевдомногопоточности, по слухам оч клевых вещей люди на основе оной добиваются.
|
|
|

19.12.2008, 11:56
|
|
Познавший АНТИЧАТ
Регистрация: 12.05.2007
Сообщений: 1,235
Провел на форуме: 2238549
Репутация:
1318
|
|
Неймлесс прав, в винде нормально не демонизируешь скрипт и не оторвёшься от консоли... Если нужна многопоточность вот тут есть интересная её реализация, правда крайне экспериментальная...
http://github.com/danhen/php_threads/tree/master
|
|
|

19.12.2008, 13:39
|
|
Участник форума
Регистрация: 21.02.2008
Сообщений: 255
Провел на форуме: 975514
Репутация:
177
|
|
многопоточность в ПХП мне не нужна.
мне нужно 2 параллельно работающих скрипта в многопоточной операционной системе.
т.е. 2 раза запустить php.exe с параметром. но не вручную а с помощью кода на пхп
если невозможно - очень жаль, я в унынии(
Последний раз редактировалось imajo.ati; 19.12.2008 в 13:42..
|
|
|

19.12.2008, 14:08
|
|
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
Провел на форуме: 298300
Репутация:
128
|
|
Сообщение от 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 выделения памяти при больших порциях.
Я думаю, для подобных операций, которые, я думаю, выполняются нечасто, такой подход вполне приемлим.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|