В большинстве случаев вы не должны трогать настройки swappiness; ядро будет делать правильные вещи по умолчанию (даже если это означает большее количество свопинга). Ядро обычно использует время простоя для спекулятивной замены некоторых страниц, которые, по его мнению, могут быть освобождены позже, чтобы при возникновении нехватки памяти быстро освободить физическую память. Я не думаю, что вы заметите снижение производительности.
Что касается приостановки на диск и свопинга: конечно, предпочтительнее свопинг на SSD из-за меньшего времени поиска, но приостановка на диск - это однопоточный линейный ввод-вывод, поэтому использование SSD для этого не сильно помогает (но занимает много драгоценного места на SSD).
Я бы рекомендовал создать два раздела подкачки: маленький на SSD и больший с более низким приоритетом на HDD, а затем использовать раздел на HDD для гибернации.
Может быть не самым эффективным для больших файлов, но вставляет новую строку импорта после ПОСЛЕДНЕГО найденного оператора import...
:
tac file | awk '/^import/ && !I {I = 1; print "import New_IMPORT"} 1' | tac
Ваша ошибка состоит в том, что вы предполагаете, что .
(, как и в .*
), не соответствует новой строке в awk
:. Это отличается от sed
, grep
, perl
, javascript
и т. д. (Думайте о awk
регулярных выражениях как о всегда жадных и с флагом //s
всегда на ).
Установка для RS
значения ^$
приведет к тому, что awk
будет выделять весь файл как одну запись, а затем шаблон \/\/.*\n
будет соответствовать от первой //
до последней новой строки в файле; ветвь import.*\n
даже не будет рассматриваться.
Вероятно, есть более разумные способы сделать это, но это будет вставлять строку import NEW_IMPORT
после первого запуска строк import
из вашего файла:
awk '!e&&/^import/,e=!/^import/{if(e)print "import NEW_IMPORT"}1' test.swift