![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Валерия |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
Собсвтенно есть файл, допустим несколько мегабайт, в котором по одной в строку идут слова.
Нужно в переменную загнать рандомно одну строку. Вариант там где весь файл грузим в массив, каждый елемент - строка, не устраивает, т.к очень не экономичный. Нужно что то пошустрее и что бы поменьше памяти кушало. Слова по длинне разные, поэтому не получиться отсчитать n*длинна_строки байт и потом прочитать эту строку, хотя это будет крайний вариант, если ничего не выйдет то пробелов в конец понаставляю которые потом буду обрезать |
|||
|
||||
| Proger89 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 13.12.2007 Репутация: нет Всего: нет |
Можно получив номер строки, читать блоками файл, и считать с начала файла количество переходов на новую строку. Когда количество пройденных 10, 13 ,будет равно полученному случайному числу, необходимо считать следуюшую строку.
Для этой затеии можно отобразить файл в память и читать файл как массив. Только не забывай что конец строки состоит из двух символов. |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
чем это? это работает быстро, а память кушать будет в 3 сек.(образно) от выполнения приложения, это много? |
|||
|
||||
| Валерия |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
Это очень много, скрипт вызываеться десяток раз за секунду. Всетаки добавлю везде в конец какихто символов, и буду через fseek переходить на нужный байт.. |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Ежели файл один и тот же, можно один раз проиндексировать его, сделав массив индексов, а затем переходить по случайному элементу из массива индексов.
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
а в качестве индекса хранить смещение в файле -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Валерия |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
Я поняла про что вы, т.е хранить байт начала строки каждой.
Но сделала по другому, просто было
стало
и теперь просто строку на которую мне нужно перейти, умножаю на количество байт любой строки, юзаю fseek и вуаля вроде быстро пашет!) всем спасибо) |
||||
|
|||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Валерия,
плохое решение имхо -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Просто неприемлемое, я бы сказал
А если разница между максимальной и минимальной длиной строки будет, скажем, 100 символов? Причём из 100000 строк в твоём файле (условно) одна будет 100 символов, а остальные 10, то тебе придётся дописать 99999*90 = 8999910 байт данных в исходный файл А если запретят менять исходную структуру или вообще писать в файл? Причём сама по себе индексация отнимает на порядок меньше операций, недели твой вариант. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Валерия |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
Сомневаюсь что с индексацией будет работать быстрее, тем более сам файл будет меняться очень редко, если вообще будет...
Я на пхп скриптик написала который приводит файл к нужному виду) |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |