![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Zmiuko |
|
|||
![]() http://zmiuko.ru ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 8.10.2008 Репутация: 2 Всего: 2 |
Ребят, у меня проблема.
Все знают как открыть файл на php, как его видоизменить посредством php, как удалить, выставить права и т.д. Проблема у меня заключается в том, что необходимо прочесть, а точнее выдернуть строку из огромного файла, будь то 100-мегабайтный или гигабайтный файл. И не только выдернуть, но и потом редактировать. Например какая либо cvs база, условно. Короче, как, каким образом можно оптимизировано и легко прочесть строку в гигабайтном файле на php? По мне в теории неясно какие функции читают файл в целом, а какие можно использовать для перемещения курсора, таким образом чтобы и строка была найдена-прочитана, да еще чтобы файл целиком не читался и не вызывал остановку скрипта. Плюс то что ограничение в php всего на 8 мегабайт. Прошу помощи, так как уже долго маюсь этой проблемой. Не могу разрешить. Заранее благодарен. Добавлено через 2 минуты и 47 секунд Речь идет не об использовании сторонних модулей, либо самописных на стороне сервера, речь идет об обычном php, стандартных функциях. |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
http://php.net/fgets - читать построчно. А вот изменить файл без полной перезаписи будет много сложнее. (и это зависит от того используются ли равноразмерные строки, или же переменной длины) Для редактирования равноразмерных строк можно использовать http://php.net/rewind http://php.net/fseek http://php.net/fwrite -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| Zmiuko |
|
|||
![]() http://zmiuko.ru ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 8.10.2008 Репутация: 2 Всего: 2 |
Но fgets() читает весь полностью файл до указания байта. То есть файл весом в 1,5 Gb мы должны прочитать полностью, к примеру, 1,2 Gb, чтобы найти искомую строку. Любой хостинг, даже с указанием максимально возможного времени выполнения php-скрипта закроет выполнение с ошибкой и указателем на строку, на которой остановилось данное выполнение.
А вот если же мы какую либо базу держим в ассоциативных массивах, условно, для примера, то тут вообще почти будет невозможным совершить какое-либо чтение при достижении файла даже 10 мегабайт? Нинавижу тестовые задания! Добавлено через 10 минут и 35 секунд Задам вопрос по-другому, к примеру на сайт загружен файл для последущего анализа php-скриптом, в нем, к примеру много-много сток, около 10-50 тысяч, файл вида: строка1 строка2 строка3 ... строка12742 строка12743 ... строка54001 строка54002 ... строка100234 строка100235 ,около 100235 строк, строки большие, где-то по 1 кб каждая. Каким образом, посредством классического, пускай процедурного php, без сторонних модулей, возможно выдернуть и изменить строку, скажем 23567-ую ? |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
Если бы вы были внимательны, прочли в документации о том, что length Reading ends when length - 1 bytes have been read, on a newline (which is included in the return value), or on EOF (whichever comes first). If no length is specified, it will keep reading from the stream until it reaches the end of the line. Из чего мы делаем вывод, что fgets читает с буфером построчно, где буфер - максимально возможная длинна строки в файле. Совершенно не важно какого размера файл, подобная конструкция прочтет его целиком не поперхнувшись:
И т.п., надеюсь из этого примера ясно, что с чем надо потреблять? -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Zmiuko |
|
|||
![]() http://zmiuko.ru ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 8.10.2008 Репутация: 2 Всего: 2 |
Ну, тогда извиняюсь.
Проблему чтения файла большого размера я еще решил подобным образом: 1) читаем файл по кускам... 2) кусками сохраняем во временный файл... 3) если во временном файле искомого не обнаружено... то стираем временный файл и приступаем к чтению и сохранению следующего куска... за 24 секунды выводит строку из 300mb файла Но как быть с редактированием, тут сложнее, или возможно также делить кусками, что вполне реально и при нахождении строки заменять ее, а затем куски "склеивать" ? |
|||
|
||||
| Zmiuko |
|
|||
![]() http://zmiuko.ru ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 8.10.2008 Репутация: 2 Всего: 2 |
|
|||
|
||||
| Ипатьев |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
||||
|
||||
| Zmiuko |
|
|||
![]() http://zmiuko.ru ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 8.10.2008 Репутация: 2 Всего: 2 |
Я просто ищу какое-либо решение и выход из поставленной ситуации. Пока не могу придумать.
|
|||
|
||||
| Ипатьев |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
А не надо ничего придумывать.
Если кто-то поставит задачу возить на велосипеде пятитонные металлоконструкции, то надо не думать над решением. А думать над умственным здоровьем постановщика задачи. И искать более адекватного. С какой стати возник вопрос об оптимальной записи? Какая разница, будет она делаться 5 минут или 25? Добавлено через 1 минуту и 14 секунд Повторю, если непонятно. Если задача ставится заведомо нерешаемая, то не нужно думать над ее решением. Надо думать над ее изменением. |
|||
|
||||
| Zmiuko |
|
|||
![]() http://zmiuko.ru ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 8.10.2008 Репутация: 2 Всего: 2 |
Хм. Но коль мне необходимо решить эту проблему, хочу я этого или нет. К чему философия?
|
|||
|
||||
| Ипатьев |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
К тому, что "необходимо" - это заблуждение, разумеется.
|
|||
|
||||
| IgorIV |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 642 Регистрация: 7.9.2009 Репутация: 2 Всего: 8 |
А это случайно не видеофайл?
|
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: -1 Всего: 17 |
Это сообщение отредактировал(а) gcc - 27.2.2010, 23:19 |
|||
|
||||
| gcc |
|
||||||||||||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: -1 Всего: 17 |
если строки упорядоченные, отсортированные, так как вы написали, то нужно использовать "Двоичный_поиск" http://ru.wikipedia.org/wiki/%D0%94%D0%B2%...%B8%D1%81%D0%BA и друугие методы математические http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%...%86%D0%B8%D0%B8 из wikipedia для бинарного:
поиск по файлу в 20Гиг будет не более чем 2-3 сек. и не будут использоватся ресурсы....
чтобы добавить в конец, можно использовать не буферизированные Сишные функции syswrite и sysread чтобы добавить в файл не открывая весь файл Это сообщение отредактировал(а) gcc - 28.2.2010, 04:49 |
||||||||||||
|
|||||||||||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
gcc, это было круто, однако у человека задача сделать сие на PHP, а поскольку задача скорее всего учебная, то другой язык не подойдет.
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |