Помогите пожалуйста по циклу php.

seosniks
На сайте с 13.08.2007
Offline
389
510

Доброго всем Дня.

бился я вчера но так и не сделал ничего.

есть у меня цикл

  for($d=0; $d<  sizeof($ok1[0]);$d++){

$text= $ok1[0][$d];
}

мне надо сдлеать чтение файла порциями.

к примеру по 5 тысяч строк.

для этого надо чтоб было типа такого

 for($d=0; $d<  5000;$d++){   

$text= $ok1[0][$d];
}

Далее еще 5 тысяч но уже начиная с 5 тысячной строки

  for($d=5000; $d<  10000;$d++){   

$text= $ok1[0][$d];
}


for($d=10000; $d< 15000;$d++){
$text= $ok1[0][$d];
}

и так до конца.

можно сделать вложенными циклами, можно как то вырезать

тоесть делать типа

unset($ok1[0][$d]); 

конечно удалять можно, но это каждый раз перезаписывать файл надо, типа так


($id != "") {
$id--;
$file=file("file.txt");

for($i=0;$i<sizeof($file);$i++)
if($i==$id) unset($file[$i]);

$fp=fopen("file.txt","w");
fputs($fp,implode("",$file));
fclose($fp);
}

Имхо лучше в цикле.

Просто у меня в цикле идут INSERT INTO в базу, по домену загонять 500 к будет нагрузка вот я и хочу объеденять порциями хотябы по 5 10 ысяч делать INSERT.

Знаю что задача нубская, но что то торможу я.

буду Вам благодарен за помощь. :drink:

A
На сайте с 04.03.2011
Offline
20
#1

как-то так?


for ($j=0; $j<=sizeof($ok1[0])/5000;$j++) {
for ($d=$j*5000;($d<($j+1)*5000) && ($d<sizeof($ok1[0]));$d++) {
$text= $ok1[0][$d];
}
}
BredoGen.
На сайте с 19.10.2009
Offline
98
#2
seosniks:

мне надо сдлеать чтение файла порциями.
к примеру по 5 тысяч строк.

для этого надо чтоб было типа такого

 for($d=0; $d<  5000;$d++){   
$text= $ok1[0][$d];
}

Разве не что-то типа такого?


$fp = fopen("file", "r");

while(!feof($fp))
{
for($i=0;$i<5000;$i++)
$text .= fgets($fp);
}
fclose($fp);

Наверное я не въехал в суть :)

A
На сайте с 04.03.2011
Offline
20
#3
seosniks:
Просто у меня в цикле идут INSERT INTO в базу, по домену загонять 500 к будет нагрузка вот я и хочу объеденять порциями хотябы по 5 10 ысяч делать INSERT.

Вы лучше своим скриптом сделайте sql-файл и потом mysql'ем его импортируйте, отключив autocommit. ну или там begin transaction/commit

seosniks
На сайте с 13.08.2007
Offline
389
#4
asdqwe:
Вы лучше своим скриптом сделайте sql-файл и потом mysql'ем его импортируйте,

Это как?

Файл сделать можно, но чем меньше движений тем будет лучше. да и файл не на столько велик аксимум 20 мб, а архив так вообще 3 мб.

у меня принцип такой.

1) скачивается файл архив.

2) распаковывается.

3) этот файл очищается и заливается в базу данных.

Все работает с помощью PHP.

У меня вот такой вопрос еще, нужно ли очищать буфер между циклами или нет?

R5
На сайте с 22.03.2010
Offline
24
#5

LOAD DATA INFILE

RFC2505 добавил 24.03.2011 в 16:26

...ну или для вашего способа

fread что б без этих ужасных циклов как у вас ) но только, если будите читать из файла потоково, нужно так же ещё определять конец sql-оператора insert, и не факт, что он окончится на конце строки

seosniks
На сайте с 13.08.2007
Offline
389
#6
RFC2505:
LOAD DATA INFILE

RFC2505 добавил 24.03.2011 в 16:26
...ну или для вашего способа
fread что б без этих ужасных циклов как у вас ) но только, если будите читать из файла потоково, нужно так же ещё определять конец sql-оператора insert, и не факт, что он окончится на конце строки

у меня файл считывается сразу весь, затем удаляется мусор выбирается то что нужно мне, и потом уже в базу загоняется.

В любом случае придется загружать весь файл в память.

Мне главное снизить нагрузку при заливке в базу.

seosniks добавил 24.03.2011 в 16:44

RFC2505:
LOAD DATA INFILE

RFC2505 добавил 24.03.2011 в 16:26
...ну или для вашего способа
fread что б без этих ужасных циклов как у вас ) но только, если будите читать из файла потоково, нужно так же ещё определять конец sql-оператора insert, и не факт, что он окончится на конце строки

если не трудно можете пример показать.

Вот как понял запрос

LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;

этот запрос вливает из файла в базу данные.

но если я правильно думаю они должны быть отформатированы .

$load="LOAD DATA INFILE 'data.txt' REPLACE INTO TABLE work IGNORE 1 LINES";

mysql -u user -p -h host database < "data.txt"

Тут два выхода: или поделить файл на меньшие файлы и заливать за несколько заходов, или написать скрипт, который преобразует SQL вставки в понятный для LOAD DATA INFILE формат.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий