LINUX.ORG.RU

«cat file | grep ...» даёт такой же результат?

IMHO когда эти утили видят регулярный файл, то они читают его через mmap(). Так быстрее, но весь файл оказывается в памяти.

А из пайпы/сокета они читают стандартным read().

PS grep с регулярками тоже может жрать память.

vel ★★★★★
()
Ответ на: комментарий от sergej

Для iconv такое поведение норма https://sourceware.org/bugzilla/show_bug.cgi?id=6050 что напрямую, что из пайпа он пытается прочитать весь файл, чтобы проще было. Я так и не понял из обсуждения бага, действительно ли iconv может работать без буферезации всего файла/потока или нет и насколько рабочие патчи предложены.

А с grep непонятно. Что за файл, там нет очень длинных строк? И насколько сложное регулярное выражение?

mky ★★★★★
()
   Known Bugs
       Large repetition counts in the {n,m} construct may cause grep to use lots of memory.  In addition, certain other obscure regular expressions require exponential time and space, and may cause grep to run out of memory.
slowpony ★★★★★
()
Ответ на: комментарий от anc

условие примерно такое

cat file | grep 12345678

файл около 100Гб, никаких регекспов искать не надо.

В таком варианте через пайп память растёт, но медленно. В варианте

grep 12345678 file

он явно всё пытается всосать наверное через mmap и быстро прибивается earlyoom.

sergej ★★★★★
() автор топика
Ответ на: комментарий от anonymous

не утилитами для небольших файлов.

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

sergej ★★★★★
() автор топика