Как лучше елозить по файлу
От: okon  
Дата: 18.06.19 13:40
Оценка:
У вас есть большой файл несколько гигабайт в котором склена куча ресурсов, со своей "файловой системой" и вам нужно вытащить оттуда сотенку ресурсов.

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

в настоящее время используется FileStream и BinaryReader,

есть ли смысл кэшировать блоки по 4кб ( или сколько кб физически читается за раз ) например, чтобы не обращаться к диску часто, если данные лежат рядом, или они и так кэшируются на уровне железа и дополнительный кэш в памяти не даст прироста скорости ?
возможно memorymappedfile работает оптимальнее в этих случаях и кэширует исключая лишние обращения ?
какие-то еще есть реализации ?
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re: Как лучше елозить по файлу
От: VladCore  
Дата: 18.06.19 13:45
Оценка: +2
Здравствуйте, okon, Вы писали:

O>У вас есть большой файл несколько гигабайт в котором склена куча ресурсов, со своей "файловой системой" и вам нужно вытащить оттуда сотенку ресурсов.


.NET юзает MMF для чтения ресурсов. У него супер эффективный кеш по сравнению с FileStream. Чем не устраивает?
Re: Как лучше елозить по файлу
От: RushDevion Россия  
Дата: 18.06.19 13:59
Оценка: 7 (1) +1
O>возможно memorymappedfile работает оптимальнее в этих случаях и кэширует исключая лишние обращения ?
Возможно. Пробуй.

O>какие-то еще есть реализации?

Читай в несколько потоков: shared режим на файле и каждый поток читает по своему смещению.
Применимость зависит от структуры файла.
Re: Как лучше елозить по файлу
От: Mihas  
Дата: 18.06.19 14:04
Оценка:
Здравствуйте, okon, Вы писали:

O>У вас есть большой файл несколько гигабайт в котором склена куча ресурсов, со своей "файловой системой"

ИМХО, сперва подумать о том, чтобы держать таблицу ресурсов в памяти. Причем, не "в лоб", а состряпать что-то типа индекса.

O> и вам нужно вытащить оттуда сотенку ресурсов.

O> решение в лоб — формально по описанию формата данных читать байты, но результат получается медленный. Хочется понять какие подходы к оптимизации есть,
Часто ли приходится тянуть один и тот же ресурс повторно? Может, кэшировать уже вытянутые ресурсы?

O>есть ли смысл кэшировать блоки по 4кб ( или сколько кб физически читается за раз ) например, чтобы не обращаться к диску часто, если данные лежат рядом, или они и так кэшируются на уровне железа и дополнительный кэш в памяти не даст прироста скорости ?

Зачем так вот наугад? Может быть, в структуре файла прослеживаются осмысленные границы блоков. И, опять же, надо анализировать повторные обращения.
Re: Как лучше елозить по файлу
От: kov_serg Россия  
Дата: 18.06.19 15:19
Оценка:
Здравствуйте, okon, Вы писали:

O>У вас есть большой файл несколько гигабайт в котором склена куча ресурсов, со своей "файловой системой" и вам нужно вытащить оттуда сотенку ресурсов.

...
O>какие-то еще есть реализации ?
Паркет не пробывали?
https://github.com/elastacloud/parquet-dotnet
Re: Как лучше елозить по файлу
От: Sharov Россия  
Дата: 18.06.19 15:27
Оценка:
Здравствуйте, okon, Вы писали:

O>есть ли смысл кэшировать блоки по 4кб ( или сколько кб физически читается за раз ) например, чтобы не обращаться к диску часто, если данные лежат рядом, или они и так кэшируются на уровне железа и дополнительный кэш в памяти не даст прироста скорости ?


В конструкторе FileStream указываете размер буффера -- чем болше размер, тем меньше обращений к диску, но тем больше RAM будет отжираться. Зависит от файла ресурсов. Выше интересную идею с потоками дали, если
формат заранее известен, т.е. каждый будет читать с определенного места.
Кодом людям нужно помогать!
Re[2]: Как лучше елозить по файлу
От: okon  
Дата: 18.06.19 17:08
Оценка:
S>В конструкторе FileStream указываете размер буффера -- чем болше размер, тем меньше обращений к диску, но тем больше RAM будет отжираться. Зависит от файла ресурсов. Выше интересную идею с потоками дали, если
S>формат заранее известен, т.е. каждый будет читать с определенного места.

C потоками интересно, но немного сомнения берут — будет ли эффект, физически диски они позволяют паралельно читать разные области ?
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re[3]: Как лучше елозить по файлу
От: andrey.desman  
Дата: 18.06.19 17:13
Оценка:
Здравствуйте, okon, Вы писали:

O>C потоками интересно, но немного сомнения берут — будет ли эффект, физически диски они позволяют паралельно читать разные области ?


Физически нет, но несколько запросов они умеют оптимизировать. Плюс не будет он н будет проста ватт, пока ты забираешь прочитанное и формирует новый запрос на чтение.
Re[3]: Как лучше елозить по файлу
От: Sharov Россия  
Дата: 18.06.19 17:28
Оценка:
Здравствуйте, okon, Вы писали:

O>C потоками интересно, но немного сомнения берут — будет ли эффект, физически диски они позволяют паралельно читать разные области ?


Почему нет? Магнитные же могли на разных пластинах читать одновременно.
Кодом людям нужно помогать!
Re[3]: Как лучше елозить по файлу
От: RushDevion Россия  
Дата: 18.06.19 18:49
Оценка: 11 (2)
O>C потоками интересно, но немного сомнения берут — будет ли эффект, физически диски они позволяют паралельно читать разные области ?
В плане скорости чтения эффект будет.
На уровне драйвера диска все запросы на чтение асинхронные.
Т.е., грубо говоря, когда ты читаешь одним потоком, то это выглядит так: послал запрос в драйвер, запрос встал в очередь, которая шарится между всеми читателями (тут не только твое приложение, а вообще все, что работает с диском).
Твой поток стоит, ждёт пока драйвер ответит. Ответил — послали следующий запрос и т.д.
Если у тебя два потока, то запросы в очередь ставятся в два раза чаще. А значит общая пропускная способность приложения растет.
Re[2]: Как лучше елозить по файлу
От: · Великобритания  
Дата: 19.06.19 10:42
Оценка:
Здравствуйте, VladCore, Вы писали:

O>>У вас есть большой файл несколько гигабайт в котором склена куча ресурсов, со своей "файловой системой" и вам нужно вытащить оттуда сотенку ресурсов.

VC>.NET юзает MMF для чтения ресурсов. У него супер эффективный кеш по сравнению с FileStream. Чем не устраивает?
Надо понимать, что MMF это не волшебный всемогутер-ускоритель всего, а просто некий алгоритм, реализующий кеш определённым образом (постраничный MRU насколько я понимаю). То же самое и асинхронность в дисках.
Оно ничего не знает о структуре файла и поэтому работает как получится.

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

Это не так уж и тривиально и зависит от характера данных и сценариев их использования. Я бы лучше начал с каких-нибудь стандартных подходов, например, запихать это всё в embedded базу данных или zip-архив.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Как лучше елозить по файлу
От: VladCore  
Дата: 19.06.19 10:52
Оценка:
Здравствуйте, ·, Вы писали:

O>>>У вас есть большой файл несколько гигабайт в котором склена куча ресурсов, со своей "файловой системой" и вам нужно вытащить оттуда сотенку ресурсов.

VC>>.NET юзает MMF для чтения ресурсов. У него супер эффективный кеш по сравнению с FileStream. Чем не устраивает?
·>Надо понимать, что MMF это не волшебный всемогутер-ускоритель всего, а просто некий алгоритм, реализующий кеш определённым образом (постраничный MRU насколько я понимаю). То же самое и асинхронность в дисках.
·>Оно ничего не знает о структуре файла и поэтому работает как получится.

Надо просто знать что MMF не всемогутер, этого никто никто и не говори, но оно всего лиш в 20 раз быстрее на маленьких "записях" в несколько байт.
Re[4]: Как лучше елозить по файлу
От: · Великобритания  
Дата: 19.06.19 11:27
Оценка: 7 (1) +2
Здравствуйте, VladCore, Вы писали:

VC>·>Надо понимать, что MMF это не волшебный всемогутер-ускоритель всего, а просто некий алгоритм, реализующий кеш определённым образом (постраничный MRU насколько я понимаю). То же самое и асинхронность в дисках.

VC>·>Оно ничего не знает о структуре файла и поэтому работает как получится.
VC>Надо просто знать что MMF не всемогутер, этого никто никто и не говори, но оно всего лиш в 20 раз быстрее на маленьких "записях" в несколько байт.
Быстрее кого? За счёт чего?
Если сравнивать с FileStream, то "запись" в его внутренний буфер будет сравнимой по скорости.

А ещё я как-то наблюдал ситуацию, когда MMF был сильно медленнее чем обычный file io в условиях когда размер файла был сильно больше доступной RAM и всё нахрен ложилось от постоянных page faults.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Как лучше елозить по файлу
От: Sharov Россия  
Дата: 19.06.19 12:17
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Если у тебя два потока, то запросы в очередь ставятся в два раза чаще. А значит общая пропускная способность приложения растет.


А вот енто не факт, поскольку кол-ов эл-ов в очереди также увелиыивается, т.е. если будет 100500 потоков с чтением, то будет bottleneck. Тут надо замерять и искходить из конкретных сценариев.
Корочер, надо вот енту штуку курить -- https://en.wikipedia.org/wiki/Queueing_theory
Кодом людям нужно помогать!
Re[5]: Как лучше елозить по файлу
От: VladCore  
Дата: 19.06.19 14:10
Оценка:
Здравствуйте, ·, Вы писали:

VC>>·>Надо понимать, что MMF это не волшебный всемогутер-ускоритель всего, а просто некий алгоритм, реализующий кеш определённым образом (постраничный MRU насколько я понимаю). То же самое и асинхронность в дисках.

VC>>·>Оно ничего не знает о структуре файла и поэтому работает как получится.
VC>>Надо просто знать что MMF не всемогутер, этого никто никто и не говори, но оно всего лиш в 20 раз быстрее на маленьких "записях" в несколько байт.
·>Быстрее кого? За счёт чего?
·>Если сравнивать с FileStream, то "запись" в его внутренний буфер будет сравнимой по скорости.

·>А ещё я как-то наблюдал ситуацию, когда MMF был сильно медленнее чем обычный file io в условиях когда размер файла был сильно больше доступной RAM и всё нахрен ложилось от постоянных page faults.


Ты рассчитывал что pagefaults не будет потому что MMF быстрее?
Re[6]: Как лучше елозить по файлу
От: · Великобритания  
Дата: 19.06.19 14:31
Оценка:
Здравствуйте, VladCore, Вы писали:

VC>>>Надо просто знать что MMF не всемогутер, этого никто никто и не говори, но оно всего лиш в 20 раз быстрее на маленьких "записях" в несколько байт.

VC>·>Быстрее кого? За счёт чего?
VC>·>Если сравнивать с FileStream, то "запись" в его внутренний буфер будет сравнимой по скорости.
VC>·>А ещё я как-то наблюдал ситуацию, когда MMF был сильно медленнее чем обычный file io в условиях когда размер файла был сильно больше доступной RAM и всё нахрен ложилось от постоянных page faults.
VC>Ты рассчитывал что pagefaults не будет потому что MMF быстрее?
Чё? Ты заявил "MMF всего лиш в 20 раз быстрее на маленьких записях" что неправда в подавляющем большинстве случаев.

MMF это просто API, чтобы легче писать код, бегающий по всему содержимому как по плоскому массиву, не мучаясь аккуратным постраничным доступом к файлу, это за тебя делает операционка.
Никакого волшебного ускорения от такого лучше не ждать. Быстрее оно может работать только в определённых условиях.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: Как лучше елозить по файлу
От: VladCore  
Дата: 19.06.19 15:41
Оценка: -1
Здравствуйте, ·, Вы писали:

VC>>>>Надо просто знать что MMF не всемогутер, этого никто никто и не говори, но оно всего лиш в 20 раз быстрее на маленьких "записях" в несколько байт.

VC>>·>Быстрее кого? За счёт чего?
VC>>·>Если сравнивать с FileStream, то "запись" в его внутренний буфер будет сравнимой по скорости.
VC>>·>А ещё я как-то наблюдал ситуацию, когда MMF был сильно медленнее чем обычный file io в условиях когда размер файла был сильно больше доступной RAM и всё нахрен ложилось от постоянных page faults.
VC>>Ты рассчитывал что pagefaults не будет потому что MMF быстрее?
·>Чё? Ты заявил "MMF всего лиш в 20 раз быстрее на маленьких записях" что неправда в подавляющем большинстве случаев.

в 20 раз быстрее на маленьких "записях" в несколько байт.


Как говорится дураки учатся на своих ошибках (с) народная мудрость. Поэтому ты и не смог впихнуть невпихуемое:

·>А ещё я как-то наблюдал ситуацию, когда MMF был сильно медленнее чем обычный file io в условиях когда размер файла был сильно больше доступной RAM и всё нахрен ложилось от постоянных page faults.


·>MMF это просто API, чтобы легче писать код, бегающий по всему содержимому как по плоскому массиву, не мучаясь аккуратным постраничным доступом к файлу, это за тебя делает операционка.

·>Никакого волшебного ускорения от такого лучше не ждать. Быстрее оно может работать только в определённых условиях.

см. народную мудрость или у вас выделения тоже читать не получается? если не получится могу H1 тегом выделить

что ещё непонятно?) поможем! когда конечно прочитаете что и при каких условиях.
Re[8]: Как лучше елозить по файлу
От: · Великобритания  
Дата: 19.06.19 19:07
Оценка:
Здравствуйте, VladCore, Вы писали:

VC>

VC>в 20 раз быстрее на маленьких "записях" в несколько байт.


VC>что ещё непонятно?) поможем! когда конечно прочитаете что и при каких условиях.

Ответь на вопросы:
Быстрее кого? За счёт чего?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[9]: Как лучше елозить по файлу
От: VladCore  
Дата: 19.06.19 21:46
Оценка:
Здравствуйте, ·, Вы писали:

VC>>

VC>>в 20 раз быстрее на маленьких "записях" в несколько байт.


VC>>что ещё непонятно?) поможем! когда конечно прочитаете что и при каких условиях.

·>Ответь на вопросы:
·>Быстрее кого? За счёт чего?

Да забей. Но я себе записал то что ты понаписывал:
  • [Любое название] — это не всемогутер-ускоритель всего.
  • [Все что угодно кроме алгоритма] — это просто некий алгоритм, реализующий свои спецефические задачи определённым образом.

    шедеврально
  • Re[10]: Как лучше елозить по файлу
    От: · Великобритания  
    Дата: 19.06.19 21:53
    Оценка:
    Здравствуйте, VladCore, Вы писали:

    VC>>>

    VC>>>в 20 раз быстрее на маленьких "записях" в несколько байт.

    VC>>>что ещё непонятно?) поможем! когда конечно прочитаете что и при каких условиях.
    VC>·>Ответь на вопросы:
    VC>·>Быстрее кого? За счёт чего?
    VC>Да забей.
    А ещё мне непонятно накой было врать
    но это не зря, хотя, может быть, невзначай
    гÅрмония мира не знает границ — сейчас мы будем пить чай
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.