Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> замена 2 произвольных строк в огромном файле 
:(
    Опции темы
polin11
Дата 16.9.2015, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть задача, поменять в огромном текстовом файле (несколько Гб) 2 произвольные строки.
Написал 2  программы: в основе 1 берем vector<string> записываем все строки,
затем меняем методом swap 2 строки, удаляем данные файла, записываем в файл
vector.
Основа 2 программы - читаем 2 строки, записываем данные в новый файл
в правильном порядке, удаляем исходный файл, переименовываем новый файл.
Проблема в том, что программа работает 5 мин, на файле 100 Мб, на файле 1ГБ, более часа.
Кто знает другой способ поменять 2 произвольные строки в огромном файле.
PM MAIL   Вверх
volatile
Дата 16.9.2015, 12:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Маппим файл в память
Находим:
 начало/конец 1-ой строки
 начало/конец 2-ой строки
Считываем 2 строки в 2 переменные.
Если строки не одинаковой длины, то делаем участку между ними move()
Записываем 2 переменные на нужные места.
(в принципе можно и одной переменной обойтись, но это суть..)
Все.
быстрее, врядли что-то возможно.

PM MAIL   Вверх
feodorv
Дата 16.9.2015, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(polin11 @  16.9.2015,  11:54 Найти цитируемый пост)
более часа

Да ладно. Первый вариант может. Второй вряд ли, даже если у Вас DOS на 386-ом компе. Каков критерий выбора строк?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
leniviy
Дата 17.9.2015, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 5



> делаем участку между ними move()
Вот этого я не понял

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
volatile
Дата 17.9.2015, 13:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



leniviy, 
Так как длина строк не равна, то просто их поменять местами нельзя.
Нужно переместить промежуток между ними, на разность длин этих строк.

Чтобы место где была меньшая строка увеличилось, для того чтобы туда поместилась большая строка.
а место где была большая строка, естественно уменьшится и станет таким, чтобы туда поместилась меньшая.

Добавлено через 1 минуту и 43 секунды
Время работы будет зависеть от расстояния первой строки от второй.
Если строки находятся рядом, то замена произойдет быстро.
Наихудший случай - первая и последняя строка файла. Тогда нужно будет сместить весь файл.

Если же строки одинаковой длины, то замена произойдет быстро, независимо ни от чего.

Добавлено через 10 минут и 29 секунд
Время работы в худшем случае - примерно будет равно времени считывания и записывания файла.
(при гигабайтном фале, ну это время в секундах... может минуту - при медленном HDD, но никак не часы)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




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


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

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