Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вносим данные из большого файла в массив

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Ограничение на размер массива?
Kubert
Отправлено: 02 Сентября, 2011 - 13:01:43
Post Id



Частый гость


Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010  


Помог: 3 раз(а)




У меня есть текстовый файл весом около 3мб.
Данные в нем хранятся в таком виде:
name1 777 888 999
name2 777 888 999
name3 777 888 999
...
...
Все пробелы это табуляция!
Всего строк на данный момент чуть больше 42 тысяч.


Мне необходимо превратить это в массив такого вида:
[0]
[0][0] - name1
[0][1] - 777
[0][2] - 888
[0][3] - 999
[1]
[1][0] - name2
[1][1] - 777
[1][2] - 888
[1][3] - 999
...
...

Делаю так:
$namefile = 'file.tsv';
$file = file($namefile);
foreach($file as $k => $v){
$nfile[$k] = explode("\t",$v);
}
print_r($nfile);


А теперь ПРОБЛЕМА! Этот код работает в тестовом режиме(в файле всего 10 строк), но когда в файле 42000 строк то скрипт не работает... В чем может быть проблема?

(Отредактировано автором: 02 Сентября, 2011 - 13:02:28)

 
 Top
EuGen Администратор
Отправлено: 02 Сентября, 2011 - 13:03:38
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




В том, что не хватает памяти, всеже file() загрузит в память все сразу.
Читайте построчно.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Kubert
Отправлено: 02 Сентября, 2011 - 13:14:00
Post Id



Частый гость


Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010  


Помог: 3 раз(а)




EuGen пишет:
В том, что не хватает памяти, всеже file() загрузит в память все сразу.
Читайте построчно.


После небольшого теста читает только 35283 строк, на 35284 уже вырубается)

А как построчно? Открывать файл с определенной строкой, потом закрывать и так несколько раз? К примеру по 10000 строк?
 
 Top
EuGen Администратор
Отправлено: 02 Сентября, 2011 - 13:19:28
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Пример чтения здесь:
http://php.su/functions/?fgets


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Kubert
Отправлено: 02 Сентября, 2011 - 13:31:05
Post Id



Частый гость


Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010  


Помог: 3 раз(а)




EuGen пишет:
Пример чтения здесь:
http://php.su/functions/?fgets


тоже самое, блин! В чем я не прав?

PHP:
скопировать код в буфер обмена
  1.  
  2. $namefile = 'test.tsv';
  3.  
  4. $i=0;
  5. $handle = fopen($namefile, "r");
  6. while (!feof($handle)){
  7.     $buffer = fgets($handle);
  8.         $nfile[$i] = explode("\t",$buffer);
  9.     //echo $buffer."<br>";
  10.         $i++;
  11. }
  12. fclose($handle);
  13.  
  14. print_r($nfile);
  15.  
 
 Top
EuGen Администратор
Отправлено: 02 Сентября, 2011 - 13:44:22
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Все верно - если Вы не используете результаты file() нигде кроме цикла, то и с построчным методом получится то же самое - я немного ошибся, посмотрев код первого сообщения.
Вам придется расширять лимит памяти, если желаете в нее загрузить сразу весь такой массив.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Kubert
Отправлено: 02 Сентября, 2011 - 13:47:01
Post Id



Частый гость


Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010  


Помог: 3 раз(а)




Лимит памяти? Это уже серверное как я полагаю?

Но ведь можно как я описал выше поделить цикл по 10000 строк... После сделать тоже самое но начиная с 10001 строки...

(Отредактировано автором: 02 Сентября, 2011 - 13:49:51)

 
 Top
EuGen Администратор
Отправлено: 02 Сентября, 2011 - 13:49:36
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




В скрипте тоже можно:
http://php.su/functions/?ini_set


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Kubert
Отправлено: 02 Сентября, 2011 - 13:51:15
Post Id



Частый гость


Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010  


Помог: 3 раз(а)




А что мне нужно то из этого списка?))
 
 Top
EuGen Администратор
Отправлено: 02 Сентября, 2011 - 13:57:31
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Думал, Вы все же не поленитесь поискать


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Kubert
Отправлено: 02 Сентября, 2011 - 14:10:55
Post Id



Частый гость


Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010  


Помог: 3 раз(а)




EuGen пишет:
Думал, Вы все же не поленитесь поискать


Спасибо! Я не ленился! Посмотрел! Но первый раз с этим сталкиваюсь. Спасибо!!!
Все получилось!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с файловой системой и файлами »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB