![]() |
|
Модераторы: bsa |
![]()
|
|
| polin11 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 6.6.2015 Репутация: нет Всего: нет |
Есть задача, поменять в огромном текстовом файле (несколько Гб) 2 произвольные строки.
Написал 2 программы: в основе 1 берем vector<string> записываем все строки, затем меняем методом swap 2 строки, удаляем данные файла, записываем в файл vector. Основа 2 программы - читаем 2 строки, записываем данные в новый файл в правильном порядке, удаляем исходный файл, переименовываем новый файл. Проблема в том, что программа работает 5 мин, на файле 100 Мб, на файле 1ГБ, более часа. Кто знает другой способ поменять 2 произвольные строки в огромном файле. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Маппим файл в память
Находим: начало/конец 1-ой строки начало/конец 2-ой строки Считываем 2 строки в 2 переменные. Если строки не одинаковой длины, то делаем участку между ними move() Записываем 2 переменные на нужные места. (в принципе можно и одной переменной обойтись, но это суть..) Все. быстрее, врядли что-то возможно. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Да ладно. Первый вариант может. Второй вряд ли, даже если у Вас DOS на 386-ом компе. Каков критерий выбора строк? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
> делаем участку между ними move()
Вот этого я не понял Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
leniviy,
Так как длина строк не равна, то просто их поменять местами нельзя. Нужно переместить промежуток между ними, на разность длин этих строк. Чтобы место где была меньшая строка увеличилось, для того чтобы туда поместилась большая строка. а место где была большая строка, естественно уменьшится и станет таким, чтобы туда поместилась меньшая. Добавлено через 1 минуту и 43 секунды Время работы будет зависеть от расстояния первой строки от второй. Если строки находятся рядом, то замена произойдет быстро. Наихудший случай - первая и последняя строка файла. Тогда нужно будет сместить весь файл. Если же строки одинаковой длины, то замена произойдет быстро, независимо ни от чего. Добавлено через 10 минут и 29 секунд Время работы в худшем случае - примерно будет равно времени считывания и записывания файла. (при гигабайтном фале, ну это время в секундах... может минуту - при медленном HDD, но никак не часы) |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |