OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 14:08

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
СообщениеДобавлено: Понедельник, 20 Март, 2017 14:58 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Цитата:
Еще прошу поделиться опытом, как быть с динамическими объектами. Скажем, если мне надо создать массив под данные из файла.
NEW нельзя получается, массивы объявить тоже только по константе возможно.
Только статические типы получается? То есть заранее делать огномный буфер под предполагаемый размер?
Или есть какие-то варианты?

Цитата:
По подводу "как с этим жить" тебе Info21 расскажет на oberoncore

Если коротко, то загружать целиком файл в цельный массив можно только в том случае, если его размер ограничен небольшим числом согласно задаче. В таком случае можно взять статический массив. В ином случае, нужно использовать что-то иное вне зависимости от того, есть в языке динамические массивы или нет. Как выглядит "гениальное" решение загружать весь файл в цельный массив можете лицезреть в большинстве редакторов при попытке открыть большой файл.

Универсального решения нет и всё зависит от задачи. Иногда достаточно окна - небольшого буфера, в который загружется нужный кусок, иногда - связный список таких окон для последовательного доступа. Если нужен моментальный произвольный доступ, то из таких окон строится "расстановка", он же hash array. Если нужна бОльшая гибкость - то дерево.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Март, 2017 05:58 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Спасибо за советы, думаю, что они пригодятся.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Март, 2017 14:23 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Реализуйте Files.File над памятью!
Или возьмите готовый!
Тут viewtopic.php?f=23&t=4214


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Март, 2017 15:46 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Иван Денисов писал(а):
Спасибо за советы, думаю, что они пригодятся.

Когда я их писал, я ещё не смотрел на WEB API для считывания содержимого файла, что важно для Вашей задачи. Выяснилось, что в нём не предусмотрено порционное чтение, а только всего файла целиком в динамический массив. Это делает мои советы бессмысленными для WEB.
Тем не менее, с файлом всё равно удобней работать не меся байты напрямую, а используя абстракцию файла.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 03 Апрель, 2017 10:44 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
Почему бы не создать пакет для работы с файлами, как они на диск отображаются? Блоками!))
А блоки связывать в один список. Разумно было бы размер блока сделать в несколько килобайт, чтобы снизить накладные расходы.
Получится "квази-динамический массив" пригодный для практического применения)))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 03 Апрель, 2017 13:36 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну так реализации Files.File в памяти так и устроены.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 03 Апрель, 2017 16:23 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
Либо я ещё из ума не выжил, либо в психушке сидят только те, кого спалили))

Идея, имхо, просто просится в реализацию именно таким способом))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Апрель, 2017 09:20 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Да, только файлы бывают и по 5 Гб и больше, а память адресовать можно только 2 Гб. Files.File может работать с такими большими файлами?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Апрель, 2017 09:59 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
Rifat писал(а):
Да, только файлы бывают и по 5 Гб и больше, а память адресовать можно только 2 Гб. Files.File может работать с такими большими файлами?

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

Здесь нельзя путать понятия "аппаратная адресация" и "логическая адресация". Если абстракция не течёт -- то о таких мелочах программист не будет думать от слова "вообще". Хотя, если программист захочет САМ, то конечно, он может при таком желании покопаться в кишках этого механизма. Но ни один грамотный специалист в добром здравии не захочет этого делать.

Тип LONGINTEGER -- 8 байт 2^64=18446744073709551616 (18 * 1024^6)(16 эксабайт или 8 эксабайт в обе стороны при индексном позиционировании от центра) , NTFS позволяет файлы 8 эксабайт, Ext4 -- 16 терабайт. Так что, гигабайты уже кажутся смешными и проблема вычислительной мощности опять упирается в проблему ввода/вывода)) Компонентный Паскаль со всеми проверками и огребаниями памяти от мусора всё-равно будет быстрее чем дисковый ввод вывод))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Апрель, 2017 11:27 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Rifat писал(а):
Да, только файлы бывают и по 5 Гб и больше, а память адресовать можно только 2 Гб. Files.File может работать с такими большими файлами?
Изначальное желание Ивана было загружать файл в память целиком. Для таких методов работы в общем случае возникает множество проблем, в том числе указанная Вами. Для Оберон-07 скорее всего нет готовой реализации Files.File, но при создании такой нужно заложить возможность работы с большими файлами.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Апрель, 2017 13:35 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Rifat писал(а):
Да, только файлы бывают и по 5 Гб и больше, а память адресовать можно только 2 Гб. Files.File может работать с такими большими файлами?

Если говорить про Блэкбокс, то это возможно после небольшой модификации ББ.
Демонстрационная версия лежит в отдельной ветке в Центре
http://blackboxframework.org/unstable/master64


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Апрель, 2017 13:41 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Тема посвящена вот такой задачке:
https://models.molpit.org/model/71
Работа с аудиофайлом в JavaScript.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Апрель, 2017 17:43 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 592
Иван Денисов писал(а):
Тема посвящена вот такой задачке:
https://models.molpit.org/model/71
Работа с аудиофайлом в JavaScript.

АЧХ звукового файла?
Спектр сигнала может быть?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Апрель, 2017 18:06 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Artyemov писал(а):
Иван Денисов писал(а):
Тема посвящена вот такой задачке:
https://models.molpit.org/model/71
Работа с аудиофайлом в JavaScript.

АЧХ звукового файла?
Спектр сигнала может быть?

Ну да, фурье спектр сигнала, но почему-то в Интернете часто это называют АЧХ, хотя АЧХ скорее для аудиколонок и наушников применяется. Пожалуй я стал жертвой собственного заблуждения, так что исправлю сейчас. Спасибо за замечание :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Январь, 2023 11:05 

Зарегистрирован: Пятница, 07 Май, 2021 11:06
Сообщения: 28
Подскажите пожалуйста, где можно почитать о принципах работы с файлами в Обероне (ну или в BlackBox). В Паскале различали несколько видов файлов:текстовые, типизированные и не типизированные. Смотрю исходники Оберона, там открывается Reader и мне не понятно указывается ли где то, что файл текстовый. Или это не нужно? Если почитать не где, может кто то напишет здесь в двух словах. Интересует как открывать и читать файл.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Январь, 2023 14:40 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Собственно, в документации к модулю Files, кажется, все есть, чтобы выстроить ответы на ваш вопрос. Вот пример:

Код:
MODULE MyM;
  IMPORT Files;
 
  PROCEDURE Read* (IN path, name: ARRAY OF CHAR);
    VAR rd: Files.Reader; f: Files.File; loc: Files.Locator;
  BEGIN
    loc := Files.dir.This(path);  (* преобразуем путь в локатор - внутреннее представление пути в ББ *)
    f := Files.dir.Old(loc, name$, Files.shared);  (* Old - открываем существующий файл *)
    rd := f.NewReader(NIL);   (* получаем у файла (файловой переменной) читатель - устройство для чтения файла *)
    rd.SetPos(0);   (* позиционируем, хотя после создания читателя он уже позиционирован на 0; это для примера *)
    REPEAT
      rd.ReadByte(b);   (* читаем 1 байт в переменную b; при этом позиция читателя сдвигается на 1 *)
      IF ~rd.eof THEN   (* проверка end of file *)
        Log.Char(CHR(b))    (* истолковываем прочитанный байт и выводим литеру в журнал *)
      END
    UNTIL rd.eof
  END Read;

END MyM.

Можно проверить, вставив в текст коммандер (!)"MyM.Read('/tmp', 'file')".

Пояснения: в КП (языке) нет понятия файл. В ББ есть модуль Files и в нем абстрактный тип File. Такие файлы - это всегда цепочки байт. У Читателя есть процедуры для чтения из файла именно байт, одного или множества. А как дальше истолковывать эти байты - как двоичные или текстовые данные, в какой кодировке и т.п. - это уже дело ваше. В моем примере я истолковал каждый байт как код литеры: привел код к литере CHR(b) и вывел в журнал.

В примере указан абсолютный путь '/tmp'. Относительные пути отсчитываются от папки BlackBox.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Январь, 2023 16:47 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
JackKatch писал(а):
Подскажите пожалуйста, где можно почитать о принципах работы с файлами в Обероне (ну или в BlackBox). В Паскале различали несколько видов файлов:текстовые, типизированные и не типизированные. Смотрю исходники Оберона, там открывается Reader и мне не понятно указывается ли где то, что файл текстовый. Или это не нужно? Если почитать не где, может кто то напишет здесь в двух словах. Интересует как открывать и читать файл.


Для текстовых файлов используются конвертеры, которые превращают документ в текстовую модель TextModels над которой уже можно работать с помощью специальных сканеров из модуля TextMappers. Почитайте в документации про подсистему Text.

Однако, если хочется использовать чтение/запись "по старинке", то посмотрите пример ObxAscii. Там показывается как сделать простую обёртку для Files, чтобы не читать вручную байты.

Цитата:
Описание системы примерами: ObxAscii

Часто входные данные программы передаются в виде текстового ASCII-файла, или спецификация программы требует, чтобы выходной формат был открытым ASCII-текстом. Этот пример показывает, как обрабатывать текстовые ASCII-файлы в Блэкбоксе и демонстрирует набросок модуля, который обеспечивает простой интерфейс обработки текстовых ASCII-файлов.

Блэкбокс отступает от стандартной модели Ввода/Вывода, которую можно видеть в других библиотеках. Модуль Files предоставляет классы, которые представляют файлы, каталоги и пути доступа для открытия файла, вместо того чтобы «впихивать» всё в одну абстракцию. Так называемые считывающие и записывающие устройства обозначают позицию в открытом файле. Несколько считывающих и записывающих устройств могут оперировать одним файлом одновременно. Файл сам по себе представляет носитель информации как таковой и может содержать произвольные данные.

Текстовой информацией занимается текстовая подсистема. Схожий с файловой абстракцией модуль TextModels предоставляет класс носителя информации — текста как такового — и класс для чтения символов из / вставки символов в текст. Модуль TextMappers представляет обычное форматирование для записи значений базовых типов Компонентного Паскаля в текст. Он также представляет класс сканера, который считывает текст и переводит символы в целые/вещественные числа, строки символов и т. д.

Текст в файлах может содержаться в разных форматах. Текст ASCII — просто особый случай текста, который не содержит информацию о типе. Так называемые конверторы используются для работы с различными форматами. Конвертор переводит байтовый поток в файле в текстовый объект в памяти и наоборот.

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

Этот пример демонстрирует обработку текстовых ASCII-файлов в Блэкбоксе. Модуль ObxAscii обеспечивает выполнение простого, традиционного интерфейса для текстового ввода и вывода. Это ни в коем случае не всё. ObxAscii тем не менее может служить моделью для реализации более полного интерфейса.

Реализация типа данных Text скрыта. Это делает возможной реализацию, отличной от той, что представлена ниже, например с использованием традиционного ввода-вывода.

Поле done типа Text отражает успешность последней операции. Процедура Open открывает существующий файл для чтения. Процедура NewText создаёт новый пустой текст для записи. Смешанное чтение/запись в один текст не очень широко распространено и поэтому не поддерживается в этой примитивной модели. Чтобы сохранить новый текст, должна быть использована процедура Register для записи файла в папку на диск. Процедура Write производит форматированый вывод, а процедура Read читает форматированные данные из текста.

Сканер и форматтер связаны с каждым текстом. Для того, чтобы прочитать текстовый ASCII файл и конвертировать его в текстовый объект, необходим конвертер для импорта файлов. Код инициализации в теле модуля находит подходящий конвертер в списке зарегистрированных файловых конвертеров и сохраняет ссылку на него в глобальной переменной conv.

Локатор и строка используются для определения папки и имени файла при вызове Open или Register. Если значение локатора — NIL, тогда переданый строковый параметр name интерпретируется как имя пути. (Мы используем хорошо себя зарекомендовавший межплатформенный URL-синтаксис для имён пути, т. е. имена папок разделены символом "/".) Процедура PathToFileSpec определяет локатор и имя файла из имени пути.

Процедура Open вызывает Converters.Import, передавая ей конвертер, хранящийся в глобальной переменной conv, чтобы загрузить в текстовый объект содержимое файла. Сканер инициализируется и устанавливается в начало текста. NewText просто создаёт новый пустой текст и инициализирует форматтер. Процедура Register использует Converters.Export с конвертером текстового ASCII-файла для помещения текста в файл.

Процедура Read проверяет, был ли открыт текст для чтения, и затем использует сканер для считывания следующего символа из текста. Если символ, считанный сканером, совпадает с желаемым типом, то поле done будет установлено в значение TRUE для отражения успеха. Процедура Write сначала проверяет, был ли открыт текст для записи, т. е. создан с помощью NewText, и затем использует форматтер для записи значений в текст.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Январь, 2023 18:29 

Зарегистрирован: Пятница, 07 Май, 2021 11:06
Сообщения: 28
Как говорится, "Хорошая мысля, приходит опосля". Открыл книгу "Проект Оберон", начал читать раздел "Текстовая система". Возможно там найду все ответы. Спасибо тем кто успел ответить. Ещё хочу сказать, что существование этого форума (проекта) оказывает неоценимую помощь. (Как минимум мне). Я вам очень благодарен, спасибо!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB