На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (5) 1 2 [3] 4 5  все  ( Перейти к последнему сообщению )  
> Проецируемые на память файлы , быстродействие и т.д.
    Цитата LuckLess @
    Я тут оспаривал не скорость( ее я нигде не оспариваю) а УДОБНОСТЬ маппинга.

    Я не оспариваю удобство маппинга для относительно небольших файлов. Я же писал, что прозрачность рандомного обращения -- это главное достоинство. Как только начинается отображение кусками то прозрачность теряется и результат получается немногим лучше чем seek & read.
    Цитата LuckLess @
    Угадай, на сколько посл код будет медленней!?

    Я не гадалка и тем более не дурак, чтобы на замерах малых промежутков времени верить чему-то кроме rdtsc. Ты хочешь попытаться убедить меня, что переключение userspace <-> kernelspace + изменение страничных каталогов + сброс кэша страниц -- очень быстрая операция?
    Сравни побайтовое чтение read (ReadFile в WinAPI -- хотя там, конечно, большая часть времени будет тратиться на заталкивание аргументов в стек) и побайтовое чтение fread. Основная разница будет получена как раз за счет минимизирования числа переключений между kernel и userspace.
    P.S. на файле размером 100 байт разницу почуствовать не удастся ;)
      Цитата linuxfan @
      Я не оспариваю удобство маппинга для относительно небольших файлов. Я же писал, что прозрачность рандомного обращения -- это главное достоинство. Как только начинается отображение кусками то прозрачность теряется и результат получается немногим лучше чем seek & read.

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


      Цитата linuxfan @
      Я не гадалка и тем более не дурак, чтобы на замерах малых промежутков времени верить чему-то кроме rdtsc. Ты хочешь попытаться убедить меня, что переключение userspace <-> kernelspace + изменение страничных каталогов + сброс кэша страниц -- очень быстрая операция?

      если тебя не устраивает кроошечная погрешность, то простите.
      но намоем камне 50000 исключений = 1 секунде.
      50000 исключений = 50000страниц = (приблизительно) 200 МБ.
      200МБ я копирую за 10 секунд(рейд у меня). значит выходит, что потери на исключениях будут порядка 10 процентов.
      Еслиб небыло рейда, потери былиб меньше(порядка 5%).

      На остольном будут еще 1-2 процента потерь. того выходит 7-12%(в зависимости от производительности винта) потерь.
      Конечно, это довольно большое число.
      И конечно для копирования файлов маппинг использовать не надо(не только изза производительности, а еще и изза того, что обычное АПИ использовать даже проще!!).
      Но для рандом акссес маппинг незаменим, вне зависимости от размеров файла.
        Цитата LuckLess @
        Ну так я и написал, что написав простенький класс оболочку над мапингом, можно добиться того, что отображение кусками станет прозрачно для пользователя, и удобство не потеряется.

        Не такой уж он простенький будет. По сути, надо будет написать свое распределение ресурсов (адресное пространство --- это ресурс). А это уже совсем другой калибр.
          Цитата mo3r @
          Не такой уж он простенький будет. По сути, надо будет написать свое распределение ресурсов (адресное пространство --- это ресурс). А это уже совсем другой калибр

          Чего там сложного то.
          Распределения не надо.
          есть указатель на буффер, дают адрес, вычисляешь какой кусок надо замапить, смотришь не он ли замаппен, если не он, мапиш другой кусок.
          очень и очень не сложно.
            Цитата LuckLess @
            есть указатель на буффер, дают адрес, вычисляешь какой кусок надо замапить, смотришь не он ли замаппен, если не он, мапиш другой кусок.

            В этом месте прозрачность уже потеряна, т. к. операции вот такого вот вида:
            ExpandedWrap disabled
              len = strlen(mapped);

            при частичном маппинге уже не покатят. На каждое обращение к отображенной памяти (причем обращение видимо происходит блоками фиксированного размера, т. к. иначе как ты определишь, когда надо еще одну часть мапить?) у тебя происходит выполнение дополнительного кода проверок, который будет выполнять два сравнения (а это три чтения: нижняя граница, верхняя граница и сам адрес), т. е. накладные расходы превышают 300% * размер_указателя (или оффсета) / размер_блока, т. е. если это побайтовое чтение, то накладные расходы на 32-битной архитектуре составят более 1200%!
            И после этого мы удивляемся, что компы так тормозят!
              Цитата linuxfan @
              при частичном маппинге уже не покатят. На каждое обращение к отображенной памяти (причем обращение видимо происходит блоками фиксированного размера, т. к. иначе как ты определишь, когда надо еще одну часть мапить?) у тебя происходит выполнение дополнительного кода проверок, который будет выполнять два сравнения (а это три чтения: нижняя граница, верхняя граница и сам адрес), т. е. накладные расходы превышают 300% * размер_указателя (или оффсета) / размер_блока, т. е. если это побайтовое чтение, то накладные расходы на 32-битной архитектуре составят более 1200%!
              И после этого мы уд

              Мдааа..
              strlen() говоришь? Он применяеться для строк! В данном случае мы работаем с бинарным файлом, и никакой strlen() применен быть не может.
              Object.size(); вот и вся прозрачность.
              А про накладные расходы - это вообще сказка.
              Мне надо хранить
              1. текущий offset(для точо, чтобы не мапить , что уже замапено)
              2. размер (можно и не хранить а все время вычислять.)
              3. Handle файла и мапы.
              4. Указатель на мапу.
              5. Размер блока(если вдруг захочеться понастраивать объект, задавая ему разный размер блока)
              24 байта!! Это очень небольшой расход??? учитывая что без этого объекта нам бы все равно пришлось бы это все вычислять.
              два сравнения говоришь. Я сейчас просто заплачу.
              1200% насчитал.
              побайтовой чтение, мдаа...
                Цитата LuckLess @
                Он применяеться для строк! В данном случае мы работаем с бинарным файлом, и никакой strlen() применен быть не может.

                В файле вполне могут храниться строки.
                  Цитата mo3r @
                  В файле вполне могут храниться строки.

                  нужна строка, пользуй
                  std::ifstream& operator>> (std::ifstream&, std::string&)

                  Не бывает одного инструмента на все! случаи жизни. И таких инструментов не будет никогда.
                    Цитата LuckLess @
                    1200% насчитал.

                    1200% --- это накладные расходы по времени.

                    Добавлено
                    Цитата LuckLess @
                    нужна строка, пользуй
                    std::ifstream& operator>> (std::ifstream&, std::string&)

                    Строки внутри структур данных, например.
                    Цитата LuckLess @
                    Не бывает одного инструмента на все! случаи жизни. И таких инструментов не будет никогда.

                    :yes: Просто с помощью mmf практически слишком сложно работать с файлами размером больше, чем можно адресовать одним указателем.
                      Цитата mo3r @
                      1200% --- это накладные расходы по времени.

                      Без этого класса нам бы тоже пришлось посмотреть тот тли кусок замапен, и тоже мапить другой, если он не замапен.
                      в случае простого чтения нам бы тоже пришлось посмотреть тот ли кусок прочитан, и прочитать его.
                      Только этот класс все это дело инкапсулирует!
                      Накладных расходов тут нет.

                      Добавлено
                      Цитата mo3r @
                      :yes: Просто с помощью mmf практически слишком сложно работать с файлами размером больше, чем можно адресовать одним указателем.

                      Не сложно, а "накладно".
                        Цитата LuckLess @
                        А про накладные расходы - это вообще сказка.
                        Мне надо хранить
                        1. текущий offset(для точо, чтобы не мапить , что уже замапено)
                        2. размер (можно и не хранить а все время вычислять.)
                        3. Handle файла и мапы.
                        4. Указатель на мапу.
                        5. Размер блока(если вдруг захочеться понастраивать объект, задавая ему разный размер блока)
                        24 байта!! Это очень небольшой расход??? учитывая что без этого объекта нам бы все равно пришлось бы это все вычислять.
                        два сравнения говоришь. Я сейчас просто заплачу.
                        1200% насчитал.

                        Ты меня неправильно понял. Предположим, что у тебя есть прокси-класс, который выполняет отображение различных кусков файла по мере необходимости. Допустим, что для этого класса у тебя определен оператор [], читающий один байт.
                        Для того, чтобы прочитать один байт из отображенной части файла тебе надо проверить, лежит ли этот байт в уже замапленой части файла или нет (две дополнительных операции чтения + чтение переданного параметра -- номера ячейки). Т. е. для осуществления каждой операции чтения байта нам надо осуществить три операции чтения 32-битных слов и две операции сравнения этих слов.
                        Кроме того, в "простеньком классе" не обработаешь хорошо случайный доступ -- периодически будет выполняться ремаппинг одних и тех же частей, а для последовательного чтения обычный (f)read проще, удобнее и быстрее.

                        Добавлено
                        Цитата LuckLess @
                        в случае простого чтения нам бы тоже пришлось посмотреть тот ли кусок прочитан, и прочитать его.

                        В случае простого последовательного чтения никуда смотреть не надо -- мы читаем очередной кусок, обрабатываем его и берем следующий -- мы просто используем правильный алгоритм и не создаем лишних сущностей :)
                        Не надо стремиться для решения конкретной задачи выбирать наиболее общую абстракцию. Как правило, это не приводит ни к чему хорошему. При решении задачи надо стремиться использовать все имеющиеся естественные ограничения себе на благо.
                          Цитата linuxfan @
                          В случае простого последовательного чтения никуда смотреть не надо -- мы читаем очередной кусок, обрабатываем его и берем следующий -- мы просто используем правильный алгоритм и не создаем лишних сущностей :)
                          Не надо стремиться для решения конкретной задачи выбирать наиболее общую абстракцию. Как правило, это не приводит ни к чему хорошему. При решении задачи надо стремиться использовать все имеющиеся естественные ограничения себе на благо.


                          Я чувствую мы просто все время о разных вещах говорим :lol: :lol:
                          Ты говориш берем следующий - это понятно и так)
                          Я говорю про случай, когда мы не знаем кто следующий!
                          Например у тебя попросили 5-и миллиардный байт, затем 62-й , затем 3-х миллиардый потом 3-й.
                          И как ты тут будешь определять кто следующий. Все равно придеться делать эти проверки(о которых я выше говорил).
                          Но если читать read() - ом , писать это дело будет тяжелее.
                          Я говорю о произвольном доступе к различным(не последовательным) частям файла. Причем используя кэширующее чтение(т.е. не побайтовое ессесно), с возможностью изменения размера блоков для чтения.

                          Цитата linuxfan @
                          Кроме того, в "простеньком классе" не обработаешь хорошо случайный доступ -- периодически будет выполняться ремаппинг одних и тех же частей

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

                          Добавлено
                          Былиб 64-ые процессоры более массовыми... :rolleyes: :rolleyes:
                            Цитата LuckLess @
                            Я всегда знаю кто уу меня замапен, поэтопу ремаппинг будет только в случае если я замапил уже другой кусок и если я вернусть к старому куску то с большой вероятностью найду его в кеше системы.

                            :blink: Это че такое?
                            Если ты будешь заново мапить старый кусок, то это будет нести те же накладные расходы на перестройку каталогов страниц. Если такой ремаппинг будет частым, то комбинация seek & read вполне сможет его обогнать.
                            И вообще, не бывает таких задач, чтобы читать совсем рандомные участки файлов (кроме тестов скорости винчестеров). Такую задачу эффективно можно решить только при корректной полной постановке, когда можно будет воспользоваться соображениями о внутреннем устройстве файла, загрузить в память часто используемые области (например, индексы БД) и т. д.
                            Цитата LuckLess @
                            Былиб 64-ые процессоры более массовыми... :rolleyes: :rolleyes:

                            Вообще-то они уже массовые. И на работе, и дома.
                              Цитата linuxfan @
                              Вообще-то они уже массовые. И на работе, и дома.

                              Знаю 1-го челоека с 64-ым камнем.
                              Сам куплю Конрое..

                              Цитата linuxfan @
                              :blink: Это че такое?
                              Если ты будешь заново мапить старый кусок, то это будет нести те же накладные расходы на перестройку каталогов страниц.

                              Да. Но не будет чтения с диска, который суть - основной тормоз.
                              Вспомни, я говорю о удобном но не максимально быстром классе ;)

                              В побайтовом чтении fseek() + read() то обойтет скорее всего.
                              Но когда надо работать с диапазонами адресов расположенными в разных участках файла...

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

                              Так что расссуждать бессмысленно, если нет этой самой полной постановки ;)

                              ps: я вообще за fstream + отрезания яиц тем, кто лепит большие файлы :lol:
                                Цитата LuckLess @
                                ps: я вообще за fstream + отрезания яиц тем, кто лепит большие файлы :lol:

                                Как жестоко. А вот чтобы не лепить большие файлы и придумали пайпы :)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (5) 1 2 [3] 4 5  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0560 ]   [ 16 queries used ]   [ Generated: 22.02.26, 10:14 GMT ]