Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Достать строку из файла, Из большего файла 
V
    Опции темы
Sunvas
Дата 15.1.2008, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 8
Всего: 89



Есть один большой текстовый файл (по 10Мб). Нужно достать из него случайным образом выбранную строку. Как это сделать?

Конечно можно воспользоваться функцией file(), но, возможно для больших объемов есть более продуктивные способы?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
GeneralElectric
Дата 15.1.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



есть fgets(), есть fread()+fseek()
PM MAIL   Вверх
FractalizeR
Дата 16.1.2008, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 27.12.2007
Где: Россия/Москва

Репутация: 2
Всего: 4



А можно file()


--------------------
Чтобы поблагодарить или наоборот поругать участника форума лучше пользоваться значками "+" и "-", изменяющими репутацию. Они находятся слева от поста под именем пользователя.
PM MAIL   Вверх
Sunvas
Дата 16.1.2008, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 8
Всего: 89



Да. Таки пришлось использовать file т.е. он быстрее..


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
GeneralElectric
Дата 16.1.2008, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



fread()+fseek() , разумеется, будет быстрее, но не буду спорить.
PM MAIL   Вверх
FractalizeR
Дата 16.1.2008, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 27.12.2007
Где: Россия/Москва

Репутация: 2
Всего: 4



Цитата(GeneralElectric @ 16.1.2008,  01:36)
fread()+fseek() , разумеется, будет быстрее, но не буду спорить.

Думаю, что да, но при оптимальном алгоритме поиска строки с заданным номером. Строки ведь не фиксированной длины.


--------------------
Чтобы поблагодарить или наоборот поругать участника форума лучше пользоваться значками "+" и "-", изменяющими репутацию. Они находятся слева от поста под именем пользователя.
PM MAIL   Вверх
Sunvas
Дата 16.1.2008, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 8
Всего: 89



Цитата(GeneralElectric @  16.1.2008,  01:36 Найти цитируемый пост)
fread()+fseek()

Мне нужна не позиция в файле, а именно СТРОКИ. Как при fseek указать номер строки если они по длине все разные??


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
GeneralElectric
Дата 16.1.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



Тебе не нужно указывать номер строки. Тебе все равно, какой у нее будет номер.
PM MAIL   Вверх
FractalizeR
Дата 16.1.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 27.12.2007
Где: Россия/Москва

Репутация: 2
Всего: 4



Цитата(GeneralElectric @ 16.1.2008,  11:41)
Тебе не нужно указывать номер строки. Тебе все равно, какой у нее будет номер.

Фактически в данном случае требуется найти в файле \r\n, стоящий в произвольной позиции от начала файла, а затем взять все содержимое до следующего \r\n, если пользоваться fopen/fseek.


--------------------
Чтобы поблагодарить или наоборот поругать участника форума лучше пользоваться значками "+" и "-", изменяющими репутацию. Они находятся слева от поста под именем пользователя.
PM MAIL   Вверх
Sunvas
Дата 16.1.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 8
Всего: 89



Эмм.. smile 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
FractalizeR
Дата 16.1.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 27.12.2007
Где: Россия/Москва

Репутация: 2
Всего: 4



Ну....

Выбираем случайное число R.
Инициализируем счетчик C=1.

Читаем из файла байты, пока нам не встретится последовательность байт \r\n. С=С+1.
Повторяем, пока C не станет равно R.

Выбираем все байты в строку, пока снова не встретим \r\n или конец файла.

Не заморачивайтесь smile Используйте file() пока скорость позволяет. Если станет медленно - можно в базу данных все перенести.


--------------------
Чтобы поблагодарить или наоборот поругать участника форума лучше пользоваться значками "+" и "-", изменяющими репутацию. Они находятся слева от поста под именем пользователя.
PM MAIL   Вверх
GeneralElectric
Дата 16.1.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



Дада. Именно выборка случайных строк - это и есть причина, по которой стоит помещать данные в реляционную СУБД. Она просто рыдает от счастья при мысли о таких задачах.

Добавлено через 2 минуты и 47 секунд
Sunvas, это ты искал хостинг для рассылки спама, если не ошибаюсь? И эта случайная выборка - для того же?
PM MAIL   Вверх
FractalizeR
Дата 16.1.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 27.12.2007
Где: Россия/Москва

Репутация: 2
Всего: 4



Цитата(GeneralElectric @ 16.1.2008,  15:08)
Дада. Именно выборка случайных строк - это и есть причина, по которой стоит помещать данные в реляционную СУБД. Она просто рыдает от счастья при мысли о таких задачах.

Я с вами согласен, но какая из систем не рыдает от счастья при мысле о выборе случайной строки из объема данных в 10Мб?
В этом случае просто вопрос - зачем это делать? Что за задача требует такого?

Кроме того, СУБД в отличие от PHP базу всю читать насквозь не будет. Ограничится первичным ключом да и то не всех строк.


--------------------
Чтобы поблагодарить или наоборот поругать участника форума лучше пользоваться значками "+" и "-", изменяющими репутацию. Они находятся слева от поста под именем пользователя.
PM MAIL   Вверх
MoLeX
Дата 16.1.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Sunvas перелож все на СУБД. когда записей будет больше, скрипт крякнет в час пик.


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
GeneralElectric
Дата 16.1.2008, 16:21 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



Цитата(FractalizeR @  16.1.2008,  15:12 Найти цитируемый пост)
Кроме того, СУБД в отличие от PHP базу всю читать насквозь не будет.

Я с кем сейчас разговаривал? И о чем? О чтении PHP "всей базы"? 

Файл на диске плюс случайный fseek - идеальное по производительности решение задачи. простое и очевидное.
Откуда здесь наросла такая дискуссия с приплетением базы данных - я не понимаю.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0601 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.