Nano Hash - криптовалюты, майнинг, программирование

Разбор: загрузить в память или использовать поток

Я пишу небольшой синтаксический анализатор и хотел бы знать преимущества и недостатки различных способов загрузки данных для анализа. Я подумал о двух способах:

  • Загрузите содержимое файла в строку, затем проанализируйте строку (доступ к символу в позиции массива)
  • Разбирать как чтение файлового потока (fgetc)

Первый позволит мне иметь две функции: одну для parse_from_file и parse_from_string, однако я считаю, что этот режим займет больше памяти. У последнего не будет недостатка в виде использования большего объема памяти.

Есть ли у кого-нибудь советы по этому поводу?

11.08.2010

  • Вам особенно не хватает памяти? 11.08.2010
  • @Neil Не обязательно, однако я хотел бы, чтобы объем памяти был как можно меньше. 11.08.2010
  • Почему? Я хочу сказать, это ограничение? Если нет, вы обычно должны предпочесть прочитать как можно больше в памяти и проанализировать ее там. 11.08.2010
  • @Neil, даже если это не для OP, позже это может стать ограничением для кого-то другого, использующего код. Могут быть причины реализовать это, сначала загрузив все в память, но загружайте это в память, если у вас нет веской причины не звучать для меня как обратное рассуждение. 11.08.2010
  • @Р. Тогда нам придется разойтись по этому поводу. 11.08.2010

Ответы:


1

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

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

Хороший баланс - иметь большой кольцевой буфер (x * 2 * 4096 - хороший размер), который вы загружаете с данными файла, а затем читаете ваш токенизатор. Всякий раз, когда объем данных блока передается вашему токенизатору (и вы знаете, что он не будет возвращен), вы можете пополнить этот блок новыми данными из файла и обновить некоторую информацию о местоположении буфера.

Еще одна вещь, которую следует учитывать, - есть ли вероятность, что токенизатор когда-либо понадобится, чтобы его можно было использовать для чтения из канала или от человека, вводящего непосредственно какой-либо текст. В этих случаях ваши чтения могут возвращать меньше данных, чем вы запрашивали, не будучи в конце файла, а метод буферизации, о котором я упоминал выше, становится более сложным. Буферизация stdio хороша для этого, поскольку ее можно легко переключить на / из строчной или блочной буферизации (или без буферизации).

Использование gnu fast lex (flex, но не Adobe Flash) или аналогичного может значительно облегчить проблему со всем этим. Вам следует изучить возможность его использования для генерации кода C для вашего токенизатора (лексический анализ).

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

11.08.2010

2

Рассмотрите возможность использования lex (и, возможно, yacc, если язык вашей грамматики соответствует его возможностям). Lex возьмет на себя все тонкости лексического анализа и создаст эффективный код. Вы, вероятно, сможете превзойти его объем памяти на несколько байтов, но сколько усилий вы хотите потратить на это?

11.08.2010
  • В gnu flex есть возможность использовать stdio или системный вызов read без дополнительных накладных расходов на stdio. 11.08.2010

  • 3

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

    11.08.2010
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..