Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Сохранение изменений в файле


Автор: integral 19.1.2008, 16:08
снач собстно пишу лабу - компилятор, пнятно простенький для простенького языка. И как во всех компиляторах, имеется текст-ареа для текста программы (реализовано через JTextArea). Пользователь указывает искходник, и текст их исходника переписуется сюда. После этого пользователь имеет возможность менять код и компилить. Так вот, сейчас компиляция идет из файла. Т.е. пользователь клацает "компиле", файл перезаписуется (ВЕСЬ, что кажется не есть гуд) и после этого идет считывание лексем с файла. Компилятор однопроходный.
Хочеться:
1. Оптимизировать как-то перезапись. Это возможно? Что возможно я знаю, и даже имею некоторые соображения... но какие-то они очень не оптимальные...
2. Хочется, что бы компилятор считывал символы из окна, а не файла. Если нада изменить текст-ареа на другой компонент - велкомsmile с удовольствием выслушаю предложения... Идея getText и считівать со стоки не приемлимаsmile Помнится, біл компонент, дающий образ или что-то такое содержания... вобщем. что бы всеь текст в память не загонять... Или все же лучше компилить путем сохранения изменений в файл, а потом считывать из файла... Кто что думает?
Спасибо за помощь!

Автор: JackYF 19.1.2008, 17:05
integral, честно говоря, ты сюда намешал проблемы реализации и ещё чего-то... я не понял сути вопроса.

Автор: integral 20.1.2008, 11:38
Цитата(JackYF @ 19.1.2008,  17:05)
integral, честно говоря, ты сюда намешал проблемы реализации и ещё чего-то... я не понял сути вопроса.

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

Автор: JackYF 20.1.2008, 12:02
Цитата(integral @  20.1.2008,  10:38 Найти цитируемый пост)
без использования перезаписи полностью всего содержимого.  

Учитывая то, что даже если у тебя файл размером 1 метр, и пользователь добавит в начало 1 байт, тебе всё равно придётся так или иначе переписывать весь файл... ты ещё хочешь это реализовывать? smile

Автор: MAKCim 20.1.2008, 12:06
Цитата(integral @  20.1.2008,  11:38 Найти цитируемый пост)
Интересует алгоритм сохранения текстового файла, который частично изменен... без использования перезаписи полностью всего содержимого. 

мэппинг файлов тебе поможет
CreateFileMapping() - Windows
mmap() - Linux

Автор: maxim1000 20.1.2008, 13:17
ну если так сильно хочется оптимизировать именно этот участок, то можно найти место первого изменения и начинать перезапись только с него
кроме того можно поискать участки, которые не были сдвинуты и остались без изменения, их тоже можно не перезаписывать...

P.S.

Цитата(integral @  19.1.2008,  16:08 Найти цитируемый пост)
Идея getText и считівать со стоки не приемлима

а почему, если не секрет?

Автор: Kangaroo 20.1.2008, 14:38
Цитата(integral @  19.1.2008,  15:08 Найти цитируемый пост)
Оптимизировать как-то перезапись. Это возможно?

А что тексты программ могут быть такими большими, что требуется оптимизация? Это ж сколько тысяч строк туда надо всунуть?


Цитата(integral @  19.1.2008,  15:08 Найти цитируемый пост)
Идея getText и считівать со стоки не приемлима

Почему? Есть вариант в одном потоке запустить сохранение, а в другом - компиляцию.

Автор: integral 20.1.2008, 17:34
Цитата(maxim1000 @ 20.1.2008,  13:17)

Цитата(integral @  19.1.2008,  16:08 Найти цитируемый пост)
Идея getText и считівать со стоки не приемлима

а почему, если не секрет?

не секрет) Типа много памяти скушает, если файл эдак на метр
Воще наю, что файлы с кодом не такие большие, и на всю эту оптимизацию можна забидь, но такие пожелания преподаsmile

Автор: Mayk 20.1.2008, 17:57
Цитата(integral @  20.1.2008,  21:34 Найти цитируемый пост)
Типа много памяти скушает, если файл эдак на метр

Метр это много  smile  smile ? Вообще-то, 21-ый век на дворе. Тыкай препода носом в "преждевременная оптимизация --- корень всех зол" из любой мало мальский уважающей себя книге по программингу.

Автор: JackYF 20.1.2008, 18:16
Цитата(Mayk @  20.1.2008,  16:57 Найти цитируемый пост)
Тыкай препода носом в "преждевременная оптимизация --- корень всех зол" из любой мало мальский уважающей себя книге по программингу.

ППКС.
Хотя знаю по опыту, препод может тупо на всё это забить. Но попытаться стоит.

Автор: maxim1000 20.1.2008, 19:44
Цитата(Mayk @  20.1.2008,  17:57 Найти цитируемый пост)
Метр это много  smile  smile ? Вообще-то, 21-ый век на дворе. Тыкай препода носом в "преждевременная оптимизация --- корень всех зол" из любой мало мальский уважающей себя книге по программингу.

нужно различать учебные и реальные задачи
в реальных задачах случаются ситуации, когда действительно нужно оптимизировать, и идея готовить к этому учеников (как и к навыкам выбора времени и места оптимизации) лично мне кажется вполне хорошей
для этого совсем необязательно (хотя и желательно) работать с огромными массивами данных

Добавлено через 3 минуты и 21 секунду
во многих средах реализовано сохранение перед компиляцией, поэтому вполне естественно сохранить его в файл, а потом читать его оттуда
кроме того, раз уж компилятор однопроходный, анализ файла не должен приводить к необходимости хранения его целиком в памяти

Автор: JackYF 20.1.2008, 20:08
Цитата(maxim1000 @  20.1.2008,  18:44 Найти цитируемый пост)
поэтому вполне естественно сохранить его в файл, а потом читать его оттуда
кроме того, раз уж компилятор однопроходный, анализ файла не должен приводить к необходимости хранения его целиком в памяти 

по-моему, ты не дочитал. Автор хочет сохранять только изменённые куски файла на диск. А это много геморроя не по теме и почти бесполезно с точки зрения времени исполнения кода, если даже не хуже.

Автор: Mayk 20.1.2008, 20:59
Цитата(maxim1000 @  20.1.2008,  23:44 Найти цитируемый пост)
нужно различать учебные и реальные задачи
в реальных задачах случаются ситуации, когда действительно нужно оптимизировать, и идея готовить к этому учеников (как и к навыкам выбора времени и места оптимизации) лично мне кажется вполне хорошей
для этого совсем необязательно (хотя и желательно) работать с огромными массивами данных

К этому — это к чему? К оптимизации без запуска профилировщика? ИМХО — Определенно Плохая Идея.

Автор: maxim1000 21.1.2008, 01:37
Цитата(Mayk @  20.1.2008,  20:59 Найти цитируемый пост)
К этому — это к чему? К оптимизации без запуска профилировщика?

учёба в данном случае разбивается на части
ведь нас сначала учат решать квадратные уравнения, однако, сама идею решать квадратные уравнения без надобности в реальной работе тоже кажется несколько необычной, если не сказать вредной
делается это для того, чтобы в случае появления подобной задачи человек уже владел этим инструментарием

Добавлено через 3 минуты и 25 секунд
ИМХО, здесь ситуация, как с изучением инстранного языка - человек должен уметь выражать свои мысли и понимать чужие
даже если на данный момент нет англоязычного человека рядом, два русскоязычных человека садятся рядом и начинают общаться, хотя, если подумать реально, значительно проще передать эту информацию на русском

Автор: Sardar 21.1.2008, 04:47
Древний MS Word писал в свой .doc, изнутри больше похожий на файловую систему. Естественно в новых форматах от этого ушли, ресурсов больно много smile

Можно повторить путь гиганта, создать средний файл (растёт по мере надобности блоками), внутри разбить на небольшие блоки, связать в одно дерево (B+ tree). Дальше по задаче, можно при каждом сейве блок изменять (параллельное редактирование многими пользователями затруднительно), либо изобразить простенькую БД (даже с журналом можно smile ), что будет отдельным тредом изменения сбрасывать на диск (не деструктивное изменение, т.е. копируем блок, вносим изменения). Изменения в некотором буфере в памяти. При доле фантазии может выйти аналог SQLite smile

Автор: W4FhLF 21.1.2008, 10:02
MAKCim прав, маппинг здесь именно то, что требуется. Ведь на виртуальную память проецируется именно тот участок, который необходимо изменить. Правда с чтением из этой области злоупотреблять не стоит, ибо механизм основан на обработке исключение #PF, а это может повлиять на производительность, но для одноразовой записи подойдёт. Если при этом меняется размер и файл на физическом носителе нужно спозиционировать по-новому, то я очень сомневаюсь, что студент сможет сделать это лучше, чем драйвер ФС. 

Автор: Mayk 21.1.2008, 11:10
Цитата(maxim1000 @  21.1.2008,  05:37 Найти цитируемый пост)

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

Без профилировщиков, или хотя бы "ручного" профилирования, разговоры про инструментарий несколько не к месту.
"Угадай кто ест память/CPU" это совсем не то же самое что и "Реши квадратное уравнению". Со вторым человеский мозг справляется легко. 
С первым — ОЙ. Объемы данных не те.

Кстати, о реальном мире. Уж если стратсть такая, то после getText()'а  текст в JTextArea'у вообще-то можно смело уничтожить.
Добавим сюда garbage collector, который уничтоженную память подловит и даст приложению, и вуаля. Получаем  кучу памяти.

Автор: integral 24.1.2008, 04:13
Аха, всем пасиба за советы) Разрулил)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)