OberonCore
https://forum.oberoncore.ru/

Абстракция Files.File и её реализации
https://forum.oberoncore.ru/viewtopic.php?f=23&t=4214
Страница 2 из 3

Автор:  Пётр Кушнир [ Вторник, 15 Январь, 2013 02:07 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Я видел цитату, конечно же. Видимо, выглядит назойливо, да :)
Правильно ли я понял, понимание повлияло в лучшую (без сомнения) сторону для всех уровней реализации компоненты, вплоть до винапи?
Собственно, у меня 'проблема" как раз с винапи, каждое погружение в которое вызывает во мне лютое отвращение, даже и не знаю, почему :)

Автор:  Илья Ермаков [ Вторник, 15 Январь, 2013 02:15 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Пётр, возьмите книги Рихтера - там WinApi в плане работы с памятью и прочей системщиной отлично описано.

Автор:  ilovb [ Вторник, 15 Январь, 2013 09:20 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Илья Ермаков писал(а):
-- пардон, у Вас в цитате как раз про размер кластера тоже сказано. Ну дык - и какой на Вашей ФС размер кластера? :) А если она, например, в VDS, в виртуальной файловой системе, что для серверов почти норма сегодня - сколько там отображений до уровня НЖМД? :)

На персоналках сегодня в 99% случаев 4 КБ:
http://support.microsoft.com/kb/140365/ru
Для серверов может быть больше. Но обычно 4КБ - 8КБ.
Кстати автор Lua советует читать/писать по 8КБ.

Про VDS и Линупс ничего не скажу :)

И вот еще:
Цитата:
Каждый раз, когда происходит чтение или запись в файл с диска, то это происходит большими кусками, даже если вам нужен всего один байт. Так устроено, что минимальная физическая единица записи/чтения называется «сектор», стандартный размер которого 512 байт. Но при выборе файловой системы используется единица «кластер», размер которой кратен размеру сектора. При установке Windows, стандартный размер кластера – 4 KiB. Это значит, что если у вас есть файл размером 1 байт, то физически он будет занимать весь кластер. Соответственно при чтении/записи операционная система будет оперировать кластерами.
Из этого следует, что если записать в файл последовательно 2 KiB данных, а потом ещё 1 KiB, то на диск будет записано 4 KiB в первый раз, а потом 4 KiB второй раз. Чтобы избежать такой двойной записи в один и тот же кластер, достаточно объединить данные и скинуть их на диск за один раз. Также, если вы пытаетесь записать 2 KiB с позиции в файле 3 KiB, то первый KiB пойдёт в первый кластер, а второй KiB будет записан уже во второй кластер.
Похожая ситуация происходит при чтении. Если вы читаете сколь-угодно байт из файла, то будет прочитан весь кластер, а если данные пересекают границу двух кластеров – то два кластера. Хотя, стоит учесть, что все жёсткие диски и RAID контроллеры имеют внутренний кэш, который может существенно ускорить чтение и запись секторов.
Для избегания повторных операций чтения/записи, всегда оперируйте последовательными блоками памяти, размером в кластер. В этом поможет обычный класс FileStream, однако размер его внутреннего буфера по-умолчанию жёстко установлен в 4 KiB. Просто получите размер кластера, и передайте его в конструктор FileStream в качестве переменной bufferSize.

http://habrahabr.ru/post/165729/

Автор:  Иван Денисов [ Вторник, 15 Январь, 2013 12:42 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Я попробовал 4k сделал, разницу не особо ощутил.
Сделал 8к — ББ стал летать ощутимо быстрее. У меня Ubuntu + Wine. Файловая система ext4.

Проверьте на Windows, чувствуется ли разница? Может у кого есть файловый benchmark?

Автор:  ilovb [ Вторник, 15 Январь, 2013 13:08 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Иван Денисов писал(а):
Файловая система ext4.

А размер кластера какой?
хотя в Wine там фиг знает как оно работает

Сегодня постараюсь потестить вечером на винде.

Автор:  Илья Ермаков [ Вторник, 15 Январь, 2013 16:15 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Так что там тестить - Иван же не с диском работает через файл, а наоборот - временный файл использует как буфер в памяти. Ясное дело, чем больше - тем быстрее будет.

Автор:  ilovb [ Вторник, 15 Январь, 2013 16:31 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Илья Ермаков писал(а):
Так что там тестить - Иван же не с диском работает через файл, а наоборот - временный файл использует как буфер в памяти. Ясное дело, чем больше - тем быстрее будет.

Ничего не понял :)

Автор:  Иван Денисов [ Вторник, 15 Январь, 2013 19:36 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Илья Ермаков писал(а):
Так что там тестить - Иван же не с диском работает через файл, а наоборот - временный файл использует как буфер в памяти. Ясное дело, чем больше - тем быстрее будет.
Да нет, на задаче по скачиванию не проверял. Да там это на самом деле и не критично, и на скорость скачивания скорее всего слабо повлияет. Мне показалось, что быстрее начали открываться документы и поиск по справке быстрее выполняться. Но вот проверил сейчас еще раз и, думаю, что нужен все-таки эталонный тест. Сложно «на глаз» оценить...

Автор:  Евгений Темиргалеев [ Вторник, 15 Январь, 2013 20:31 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Иван Денисов писал(а):
Сложно «на глаз» оценить...
Ох, братцы... а если посмотреть вооружённым взглядом?
Вложение:
446404cbafcc.jpg
446404cbafcc.jpg [ 39.5 КБ | Просмотров: 14274 ]
Или прибавить в варево мышиный хвост, щепотку серы и каплю ртути --- приблизимся к философскому компоненту? ... :cry:

Автор:  Иван Денисов [ Вторник, 15 Январь, 2013 21:10 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Евгений Темиргалеев писал(а):
Ох, братцы... а если посмотреть вооружённым взглядом?
Посмотрел вооруженным — разницы нет :) что 2K, что 8K.

Чтение хромосомы, и запись в другой файл ей комплементарной последовательности.
Homo_sapiens.GRCh37.68.dna.chromosome.1.fa (253.4 МБ)
2k = 78.2 сек
4k = 78.4 сек
8k = 78.8 сек
64k = 78.3 сек

Разница в пределах случайной погрешности (фрагментации винта и т.п.).

Вложения:
bm.7z [2.68 КБ]
Скачиваний: 419

Автор:  Пётр Кушнир [ Вторник, 15 Январь, 2013 21:10 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Теперь для куска обсуждения (про кластеры на диске) понадобится целый подфорум "Эзотерика" (хотя и Флуд подойдёт)

Автор:  Роман М. [ Вторник, 15 Январь, 2013 21:46 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Иван Денисов писал(а):
И длинные строки безразмерные тоже значит можно через Files делать? Такое часто надо для биоинформатики, например, где строки очень большие. И для приема данных с прибора...
Данные с прибора имеет смысл обрабатывать по мере поступления, в памяти.

Ещё мне вспомнился TextModels.Model из-за его способности гибко работать над текстом (вставка/вырезка текста). Хотя он может быть слишком "жирным" в памяти для безатрибутного и длинного текста.

Автор:  Роман М. [ Вторник, 15 Январь, 2013 22:18 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Просмотрел код bm.7z:
конвертер может быть слишком дорогостоящей операцией для такого вида манипуляций.
Я бы избавился от него в первую очередь.

Автор:  ilovb [ Вторник, 15 Январь, 2013 23:25 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Потестил на Windows 7

Размер файла 1,5 ГБ
чтение:
2 КБ - 26193 миллисек 27253 миллисек
4 КБ - 24835 миллисек 25740 миллисек
8 КБ - 25912 миллисек 30014 миллисек


Размер файла 400 МБ
чтение:
2 КБ - 5600 миллисек 5600 миллисек
4 КБ - 5600 миллисек 5585 миллисек
8КБ - 5850 миллисек 5616 миллисек

Размер файла 1,8 ГБ
чтение:
2 КБ - 27004 миллисек 28579 миллисек
4 КБ - 28127 миллисек 28595 миллисек

Размер кучи файлов по ~4 МБ Всего 2,37 ГБ
чтение:
2 КБ - 42838 миллисек
4 КБ - 42198 миллисек
8 КБ - 41558 миллисек
16 КБ - 42573 миллисек

В общем разницы практически никакой. Думаю что виновник сего безобразия виндозный системный буфер :) Т.е. буфер BB похоже вообще ни на что не влияет.

Автор:  Пётр Кушнир [ Среда, 16 Январь, 2013 00:25 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Роман М. писал(а):
Иван Денисов писал(а):
Ещё мне вспомнился TextModels.Model из-за его способности гибко работать над текстом
Текст тоже буферизуется в Files.dir.Temp()

Автор:  Евгений Темиргалеев [ Среда, 16 Январь, 2013 08:14 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Выделена тема: "Free Pascal буферизованное чтение и запись" (viewtopic.php?f=27&t=4217)

Поближе к теме, товарищи, пожалуйста. Свои темы поднимать не стесняемся, места всем хватит.

Автор:  Info21 [ Среда, 16 Январь, 2013 09:58 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

ilovb писал(а):
Думаю что виновник сего безобразия виндозный системный буфер :)
Он всегда был очень агрессивный.

Автор:  ilovb [ Среда, 16 Январь, 2013 10:19 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Весь мой тест ф топку. :(
Сделал трап во время чтения и оказалось что буфер так и остался 2 * 1024 ...
HostFiles в exe слинкован?

Автор:  ilovb [ Среда, 16 Январь, 2013 10:25 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Действительно :)

info21:
Цитата:
Таким способом нельзя подменить только BlackBox.exe и скомпилированные модули, в него скомпонованные: Kernel, Files, HostFiles, StdLoader.

Автор:  ilovb [ Среда, 16 Январь, 2013 10:42 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

И еще. Для корректного тестирования надо бы флаг FILE_FLAG_NO_BUFFERING выставить чтобы системный буфер не смазывал картину.

Страница 2 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/