информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаАтака на InternetЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft Authenticator прекращает... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[C++] Смотря насколько большой файл 26.02.03 14:08  Число просмотров: 1247
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> > Есть файл А, нужно из него переписать строки в файл Б
> в
> > обратном порядке, заранее спасибо
> 1. Отхватить память = размеру файла.
Если файл сильно большой - может не выйти, лучше отмэпить его в память. Тут кстати была когда-то дискуссия по поводу эффективности мэппинга (в майкросовтоском его варианте). Если файл ожидается не сильно большой, то лучше всего будет действительно выделить и считать.

> 2. Прочитать его в память.
> 3. Построить индексы (заменить '\n' на '\0' полезно будет
> по ходу)
Можно открывать файл как текстовый - все \n будут заменяться на \0 если я правильно понял документацию

> 4. Ну и записать в обратном порядке.
Можно не строить индексы, а искать strrchr с конца и сразу писать в другой файл

> Если я правильно понял задачу и не заметил подвох.
> Должно быть достаточно эффективно, по сравнению с поиском
> строк в файле в обратном порядке и записью их.
<programming>
[C++] Помогите с эффективным алгоритмом 26.02.03 08:12  
Автор: Темный Эльф Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Есть файл А, нужно из него переписать строки в файл Б в обратном порядке, заранее спасибо
[C++] Задача вроде простая. 26.02.03 10:29  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
> Есть файл А, нужно из него переписать строки в файл Б в
> обратном порядке, заранее спасибо
1. Отхватить память = размеру файла.
2. Прочитать его в память.
3. Построить индексы (заменить '\n' на '\0' полезно будет по ходу)
4. Ну и записать в обратном порядке.
Если я правильно понял задачу и не заметил подвох.
Должно быть достаточно эффективно, по сравнению с поиском строк в файле в обратном порядке и записью их.
[C++] Смотря насколько большой файл 26.02.03 14:08  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> > Есть файл А, нужно из него переписать строки в файл Б
> в
> > обратном порядке, заранее спасибо
> 1. Отхватить память = размеру файла.
Если файл сильно большой - может не выйти, лучше отмэпить его в память. Тут кстати была когда-то дискуссия по поводу эффективности мэппинга (в майкросовтоском его варианте). Если файл ожидается не сильно большой, то лучше всего будет действительно выделить и считать.

> 2. Прочитать его в память.
> 3. Построить индексы (заменить '\n' на '\0' полезно будет
> по ходу)
Можно открывать файл как текстовый - все \n будут заменяться на \0 если я правильно понял документацию

> 4. Ну и записать в обратном порядке.
Можно не строить индексы, а искать strrchr с конца и сразу писать в другой файл

> Если я правильно понял задачу и не заметил подвох.
> Должно быть достаточно эффективно, по сравнению с поиском
> строк в файле в обратном порядке и записью их.
[C++] Смотря насколько большой файл 27.02.03 10:13  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
> Если файл сильно большой - может не выйти, лучше отмэпить
> его в память. Тут кстати была когда-то дискуссия по поводу
> эффективности мэппинга (в майкросовтоском его варианте).
> Если файл ожидается не сильно большой, то лучше всего будет
> действительно выделить и считать.

Очень тяжело найти текстовый файл больше, чем размер оперативки.
(Попробуйте пальчиками гигабайт забить. Да что там гигабайт - мегабайт попробуйте. При 100 знаков в минуту - 10000 минут - 166.(6) часов ~7 дней непрерывного стучания днем и ночью и пописать не отойти. А про гигабайт умолчим... Да, и компьютеры с оперативкой, размером меньше 100 мегабайт рассматривать не будем - не тот день на дворе.)
Даже если и больше оперативки - своп, как правило включен.

> Можно открывать файл как текстовый - все \n будут
> заменяться на \0 если я правильно понял документацию

Ну это смотря чем читать. Я имел ввиду залпом одним read`ом. Иначе другие проблемы...

> Можно не строить индексы, а искать strrchr с конца и сразу
> писать в другой файл

Это уж как удобнее.

Мэпить память в файл не имеет смысла - все равно те же операции.
Наилучший способ обработки файлов считывать их целиком - готов поспорить. Менше накладных расходов на вызов функции чтения при кусочной обработки. Если файл больше оперативки и работы с диском не избежать, то своп грамотнее дисковые операции обработает. К тому же обычно рабочие файлы не рабочем разделе на раиде типа 1 лежат, а своп на раид типа 0 направлен. Хочется, чтоб быстрее сработало, просто добавь модуль памяти - в оперативке уместится - в десяток раз быстрее будет. Писал я как-то библиотечку для работы с файлами базы данных таким образом (а не чтение по записям) - летала, как самолет.
Urix`у - пятерка, алгоритм простой и эффективный, вот только накладные расходы на позиционирование (lseek).
[C++] Я ж не сам придумал, а на основе обсуждения и собственного опыта 27.02.03 12:11  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Даже если и больше оперативки - своп, как правило включен.
У меня он как раз выключен, хотя бы для того чтоб проги с XML-ным интерфейсом не сильно тормозили

> > Можно открывать файл как текстовый - все \n будут
> > заменяться на \0 если я правильно понял документацию
>
> Ну это смотря чем читать. Я имел ввиду залпом одним
> read`ом. Иначе другие проблемы...
Я тоже имел в виду залпом, но одним fread-ом.

> Мэпить память в файл не имеет смысла - все равно те же
> операции.
А вот эта тема как раз очень тщательно обсасывалась и не имеет смысла еще раз делать то же самое. Единственное резюме: мэппинг в майкрософтовской реализации ведет себя мягко говоря, странно. Здесь даже проходила фича еще по одному связанному с этим вопросу: если делать CreateFile без кэширования, то (не мои слова: почем купил - за столько и продаю - не проверял) скорость его обработки возрастает чуть ли не в 3 раза.

> Urix`у - пятерка, алгоритм простой и эффективный, вот
> только накладные расходы на позиционирование (lseek).
Это да
[C++] И такие бывают 27.02.03 10:42  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка>
> Очень тяжело найти текстовый файл больше, чем размер
> оперативки.
Пара пустяков. У меня тут валяется несколько XML-описаний...

> (Попробуйте пальчиками гигабайт забить.
Ну кто ж такие вещи пальчиками делает. Слава Богу, в UNIXах программ, генерящих текстовый выход, предостаточно.
[C++] Разве что "бывают" 27.02.03 11:16  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 27.02.03 11:17  Количество правок: 1
<"чистая" ссылка>
> Пара пустяков. У меня тут валяется несколько
> XML-описаний...

Я не спорю с тем, что такие файлы бывают и их даже можно найти.
Но это редкость.

> Ну кто ж такие вещи пальчиками делает. Слава Богу, в UNIXах
> программ, генерящих текстовый выход, предостаточно.

И как часто такие файлы "переворачивать" надо?

Вы не пробовали просто прочитать документацию на несколько сотен килобайт, я уж про несколько сотен мегабайт не говорю.

И, вообще, когда речь идет о программе/алгоритме и не требуется заказчиком в постановке задачи ограничение на объем памяти, то в решении на это упор ставить не следует.

Даже если эта программа будет использоваться на практике на современных компьютерах, то для подавляющего большинства файлов она сработает. По крайней мере, я сомневаюсь, что когда-нибудь в процессе работы пользователь увидит сообщение типа: "Для обработки данного файла мало оперативной памяти, добавте, пожалуйста [столько-то] и повторите попытку".
[C++] Ну собственно и документацию переворачивать очень редко приходится :-)) 27.02.03 12:03  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Я не спорю с тем, что такие файлы бывают и их даже можно
> найти.
> Но это редкость.
>
> > Ну кто ж такие вещи пальчиками делает. Слава Богу, в
> UNIXах
> > программ, генерящих текстовый выход, предостаточно.
>
> И как часто такие файлы "переворачивать" надо?
Как раз потому, что файл надо перевернуть - он скорее всего сгенеренный. Почти во всем, набранном человеком очень важен исходный порядок строк

А насчет большого файла. Это я с фаром намучался. Уж не помню стандартный просмотрщик или редактор, но он загоняет весь файл в память целиком, а мне иногда и бинарник надо подправить символ-другой


А вообще. Алгоритмы найдены. Дальше это простой флуд. Предлагаю закрыть
Согласен 27.02.03 17:15  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach