|
|
|
| Здравствуйте!
Подскажите пожалуйста, как можно выполнить скрипт (цикл чтения из файла) по шагам.
Такая ситуация:
Есть текстовый файл file.txt его размер 30Мб
Количество строк : Имястроки|значение1|значение2|...|значениеn \n - 20000
Хочу записать все данные из файла в базу данных mysql, но:
В какойто момент (примерно, когда количество записей достигнет ~ 6000) все отанавливается - страничка просто перестает грузиться.
set_time_limit(0) не катит...
Файл открывается:
$fh= fopen($fileName,"r");
начало цикла:
while ((!feof ($fh)))
{
$str=fgets($fh);
if ($str!="")
{
Пробую прочитать файл в массив (file($my_file)) - но в этом случае выскакивает ошибка файл слишком велик...
Локально - этот способ (как и первый без шагов) работает... | |
|
|
|
|
|
|
|
для: Zhenya
(19.11.2008 в 16:24)
| | Запустите скрипт через ssh. Или, если нет ssh, то по крону (единожды).
Если нет ни того, ни другого - делайте по 1000 строк. Первую тысячу прочитали/записали в бд/стерли из файла/exit; Затем опять запускайте страничку. | |
|
|
|
|
|
|
|
для: Shorr Kan
(19.11.2008 в 16:26)
| | а по крону разве процессорное время не учитывается?
про реализацию по 1000 можно примерчик как продолжение моих строк? | |
|
|
|
|
|
|
|
для: Zhenya
(19.11.2008 в 16:32)
| | Если поставите set_time_limit(0) (то, которое вам не понраву), то крон обработает весь файл.
По 1000 - сейчас соображу. | |
|
|
|
|
|
|
|
для: Shorr Kan
(19.11.2008 в 16:36)
| | да не, я о том, что скрипту не хватает времени на обработку файла, хотя установлено set_time_limit(0)
по 1000 буду благодарен | |
|
|
|
|
|
|
|
для: Zhenya
(19.11.2008 в 16:45)
| | Я понял. Тем не менее, дело в браузере. Это он, зараза, устает ждать. А не сервер - обрабатывать. У крона нет браузера... Поэтому, по крону получится, если set_time_limit(0). | |
|
|
|
|
|
|
|
для: Shorr Kan
(19.11.2008 в 16:36)
| | 1) скопируйте файл (на всякий случай. Бэкап)
2)
<?
$fp=fopen($filename,"r+");
$i=0;
while(!feof($fp)){
$byte=ftell($fp);
$str=trim(fgets($fp));
if($str==" " or $str==""){continue;}
fseek($fp,$byte,SEEK_SET);
fwrite($fp," ");
$i++;
if($i==1000){break;}
}//while
fclose($fp);
?>
|
Не проверял на большом файле, поэтому не могу сказать, что всё получится. Но должно. | |
|
|
|
|
|
|
|
для: Shorr Kan
(19.11.2008 в 16:26)
| | >Запустите скрипт через ssh. Или, если нет ssh, то по крону (единожды).
> Если нет ни того, ни другого - делайте по 1000 строк. Первую тысячу прочитали/записали в бд/стерли из файла/exit; Затем опять запускайте страничку.
Стерли из файла?! | |
|
|
|
|
|
|
|
для: Trianon
(19.11.2008 в 20:46)
| | А что смущает-то? Строка у него, положим, в 300 байт. А мы, вместо него, ставим пробельчик - один байт. И? Его задачу выполняет. А к словам придираться... зачем? | |
|
|
|