Использует ли Data.Attoparsec.ByteString нулевое копирование?

Возьмем, к примеру, takeWhile. Внутри он использует span.

Означает ли это, что он просто ссылается на входную байтовую строку? Вероятно, нет, если да, то есть ли способ добиться этого?

Мотивирующий вариант использования — это большой (> 2 ГБ) файл, который я хочу сопоставить с памятью и извлечь строки байтов, указывающие на сопоставленную память.


person fho    schedule 13.03.2014    source источник


Ответы (1)


Да, все операции с подстроками над ByteString выполняются O(1), как вы можете видеть в документацию и сделайте неполную копию с другим смещением/длиной. Если вам это не нужно, используйте copy, чтобы получить полную копию проанализированных результатов, чтобы исходная огромная строка могла быть удалена сборщиком мусора.

Кроме того, рассмотрите Lazy воплощения mmap и Attoparsec, это может быть более оптимальным в случае последовательного разбора большого фрагмента.

person Yuuri    schedule 13.03.2014