Это не - контекст
, а \ s *
в начале вашего шаблона регулярного выражения.
Кажется, что ag
не выполняет построчный поиск, как обычный grep
, а просматривает весь файл за один раз (или, по крайней мере, несколько строк за раз время). Немного похоже на этот однострочник Perl:
perl -0777 -ne 'print "$&\n" while /^\s*(def|class)\s+[_A-Za-z]*/msg' ../prog.py
Итак, поскольку \ s
соответствует любому пробелу, включая символы новой строки, он соответствует предыдущей пустой строке, новой строке, пробелам перед следующей, а затем ключевое слово def
. Если вы добавите пустую строку перед строкой blah
, она не будет напечатана, поскольку blah
не соответствует шаблону.
Чтобы избавиться от нежелательного совпадения, используйте / ^ * ...
или / ^ [\ t] * ...
вместо / ^ \ s * ...
. (пробел + звездочка в первом)
Я думаю, проблема в том, что большинство файловых систем плохо поддерживает такое количество файлов.
Поэтому старайтесь не хранить так много файлов в одном каталоге, а разбивать их на подкаталоги.
Когда вы выполняете медленную операцию, вы можете nice / renice
chmod
, чтобы это не мешало работе веб-сервера. Но, как я писал в первом абзаце, это проблема многих файлов, поэтому чрезмерная блокировка и время в режиме ядра, что приятно, на самом деле не решает.
Наличие других устройств могло бы помочь, но ИМХО это не столько реальный ввод-вывод, сколько работа ядра из-за огромного каталога.
[Примечание: перемещение очень больших файлов не вызывает такого замедления, поэтому это не только ввод-вывод]
Механические запоминающие устройства медленные, потому что они механические. (Другие немеханические устройства хранения также могут быть медленными, но по другим причинам и по-разному.) Каждая операция ввода-вывода на механическом диске занимает фиксированное время ( время поиска , порядка миллисекунд), чтобы определить местоположение на диске, плюс переменное время для передачи данных (обычно от 40 до 200 МБ / с, в зависимости от характеристик диска). При выполнении множества мелких операций время поиска преобладает; один вращающийся диск ограничен несколькими сотнями операций ввода-вывода в секунду (IOPS) - дорогой диск SAS со скоростью 15 тыс. об / мин будет хорош примерно для 200 операций ввода-вывода в секунду, обычный диск SATA со скоростью 7,2 тыс. об / мин - для 100 операций, а маленький и дешевый - 5,4 kRPM около 70.
Использование нескольких дисков может помочь - при условии, что операции ввода-вывода распределены между доступными дисками . Распределение операций ввода-вывода между доступными дисками может выполняться автоматически с помощью подходящей конфигурации программного или аппаратного обеспечения. Использование выделенного оборудования, такого как массивы хранения, подключенные через сеть хранения данных , предпочтительно в корпоративных приложениях; для частного использования обычным подходом является использование программного обеспечения RAID ; хорошей отправной точкой является вики Linux RAID . RAID может увеличить пропускную способность, надежность или и то, и другое; если целью является увеличение пропускной способности, вам следует рассмотреть уровни RAID с чередованием, такие как RAID 0 и RAID 10.