Решение, предложенное @rahmu, просто при поиске низких положений, но что при поиске числа символов 25? Вставить 25 точек?
В таком случае следующие решения могли быть под рукой. С grep
grep '^.\{24\}a' input >output
С awk
awk -F '' '$25 == "a"' input >output
Лучшим способом создать диск поршня на Linux является tmpfs. Это - файловая система, живущая в поршне, таким образом, нет никакой потребности в ext2. Можно создать tmpfs 16 ГБ размером с:
mount -o size=16G -t tmpfs none /mnt/tmpfs
Проблема состоит в том, что максимальный размер электронного диска, более конкретно размера памяти, к которой можно получить доступ через драйвер электронного диска, настроен во время компиляции, может быть перезаписан во время начальной загрузки, но остается фиксированным, после того как ядро загружается в память. Значение по умолчанию, вероятно, измеряется в Мегабайтах. Если я вспоминаю правильно, что память для электронного диска является сохраненным правом, когда драйвер загружается, все электронные диски являются тем же размером и существует, приблизительно 16 электронных дисков по умолчанию. Так даже Вы не хотите размера электронного диска 16G :-)
Как указано в другом ответе, tmpfs - то, что Вы хотите использовать. Далее, Вы не победите много при наличии Вашей всей ОС в ramdisk/tmpfs. Просто скопируйте свой builddir в tmpfs и сделайте Вашу компиляцию затем. Вам, вероятно, придется удостовериться, что все временные результаты записаны в местоположение, это находится в tmpfs также.
blockdev --flushbufs
.
– psusi
28.02.2013, 15:57
Documentation/blockdev/ramdisk.txt
в источниках ядра. И на моем ответе: тот файл также говорит, что электронный диск растет, поскольку память используется так, это все не выделяется сразу. глюк
– Bananguin
01.03.2013, 16:46
Linux очень эффективен в использовании RAM. Существует мало удивления, что Вы видите мало если любое ускорение с tmpfs
. Самые большие части для чтения в память (и таким образом способный замедлить процесс) являются инструментами (компилятор, ассемблер, компоновщик), и в длинноватом make
они будут загружены в память при запуске и никогда не оставлять его. То, что оставляют, читает в источнике (запись из результатов не замедлит Вас, если сильно память не ограничила). Снова, общие заголовочные файлы останутся вокруг, только источник пользователя потребует чтения. И это вряд ли будет больше, чем несколько мегабайтов. Создание большого Электронного диска (или даже много использования tmpfs
) может очень хорошо замедлить вещи (путем создания памяти сборки ограниченной, файлы на Электронном диске или на tmpfs
не может использоваться непосредственно оттуда).
tmpfs
не используются широко для хранения исполняемых файлов (Электронные диски являются остатком с добрых старых времен мучительно медленных гибких дисков и такого, tmpfs
для stricty временных данных), никто не считал достаточно важным добавить необходимые ужасные взломы.
– vonbrand
28.02.2013, 18:39
Для создания большого диска поршня после начальной загрузки, без бездельничания с параметрами ядра, это, кажется, работает. Используйте tmpfs, сделайте файл, смонтируйте его через цикл и смонтируйте что через файловую систему:
mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 temp2/
Вероятно, немного потери производительности, проходящей несколько различных слоев..., но по крайней мере, это работает.
OP объем ОЗУ выражен в МБ. Итак, все, что вам нужно для ввода, это 16384. И тогда вуаля, вы готовы к делу.
Вы можете смонтировать файловую систему ramfs
, скопировать в нее свой проект и работать оттуда. Это гарантирует, что ваши входные файлы будут загружены в ОЗУ, и они не будут повторно -считаны с гораздо более медленного диска. Однако, как вы обнаружили, это, как правило, бесполезная стратегия. Вы уже получаете ту же самую выгоду.
Ramfs is a very simple filesystem that exports Linux's disk caching mechanisms (the page cache and dentry cache) as a dynamically resizable RAM-based filesystem.
--https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt
Вы уже можете быть уверены, что ваши входные файлы кэшируются в ОЗУ при первом чтении. Ваши выходные файлы также кэшируются, так что вам не нужно ждать, пока они будут записаны на диск.
Нет искусственных ограничений на объем кэша, продолжительность его хранения и т. д. Кэши начинают удаляться только после заполнения оперативной памяти. Какой кеш сбрасывается первым, выбирается ужасающе сложными алгоритмами. В первом приближении мы описываем его как «наименее недавно использовавшийся». См. Какие алгоритмы замены страниц используются в ядре Linux для файлового кэша ОС?
Обратите внимание, что ваш текстовый редактор явно fsync()
сохраняет файлы на диск.
Если вы запускаете тесты программы, включающей fsync()
, запуск их в файловой системе, такой как ramfs
, может ускорить их. Другая стратегия состоит в том, чтобы попытаться отключить fsync()
с помощью eatmydata
/ nosync.so
.
Некоторые другие операционные системы могут иметь особые ограничения, которые можно обойти с помощью виртуального диска. С одной стороны, отсутствие какого-либо кэширования файлов является причиной популярности виртуальных дисков в DOS .
tmpfs
работает так же, как ramfs
, за исключением того, что он может использовать пространство подкачки, если оно у вас есть. т.е. если вам нужна оперативная память для чего-то другого, алгоритмы наименее недавно использовавшихся могут выбирать блоки данных из tmpfs и выгружать их на диск.
Большинство людей придерживаются tmpfs
, потому что это также позволяет вам ограничить общий размер и показывает правильно используемое пространство, например. в команде df
. Я не уверен, почему существует эта разница. Ограничение размера в tmpfs
защищает вас от случайного заполнения всей вашей оперативной памяти и, по сути, уничтожения вашей системы. По умолчанию это половина вашей оперативной памяти.
Вышеупомянутое упрощение адаптировано для вашего случая. Запись в файлы в вашем случае не должна ждать диска. Однако есть некоторые случаи записи, которые делают. См. отличный пост в блоге Почему буферизованная запись иногда останавливается . Самым удивительным случаем является недавнее изменение в Linux под названием «стабильная запись страницы».
Помимо tmpfs
и ramfs
, еще одним вариантом является блочное устройство /dev/ram0
. В последних версиях Ubuntu это устройство не существует по умолчанию, но его можно создать с помощью modprobe brd
.
Этот подход более предсказуем, поскольку он создает реальную ext4
файловую систему и никогда не превышает указанный вами предел. Но для настройки требуется больше действий, а оперативная память используется менее эффективно.
Чтобы создать и инициализировать RAM-диск объемом 4 ГБ:
mkdir /ramdisk
modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk
Параметр rd_nr
указывает, сколько RAM-дисков создавать (по умолчанию, он создает 16, т.е. /dev/ram0
-/dev/ram15
). Параметр rd_size
имеет размер в килобайтах . Синтаксис $((... ))
позволяет выполнять арифметические действия в оболочке.
Чтобы освободить RAM-диск, размонтируйте его и удалите brd
модуль ядра:
umount /ramdisk
modprobe -r brd
ramfs
Кроме того, вы можете создать блочное устройство внутриramfs
:
mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage
truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk
Команда truncate
создает пустой файл заданного размера таким образом, что он инициализируется (, т.е. потребляет память )по запросу -.
Чтобы освободить RAM-диск, размонтируйте его и удалите образ диска:
umount /ramdisk
rm /ramdisk-storage/ramdisk.img
tmpfs
иramfs
Хотя tmpfs
и ramfs
более эффективны, чем использование блочного устройства, ниже приведены некоторые их недостатки.
tmpfs
может переключиться на диск. Это более эффективно, но иногда вам может понадобиться чистый RAM-диск :
ramfs
легко настроить, освобождает место после удаления файлов,и использует оперативную память более эффективно (система не буферизует файлы, поскольку знает, что они находятся в оперативной памяти ). Но у него есть свои минусы и сюрпризы:
Утилита df
не сообщает об использовании пространства:
root@cello-linux:~# df -h /ramdisk
Filesystem Size Used Avail Use% Mounted on
ramfs 0 0 0 - /ramdisk
Параметр ограничения размера отсутствует. Если вы поместите слишком много на виртуальный диск, ваша система зависнет.
Разреженные файлы могут стать неразреженными, когда вы меньше всего этого ожидаете. Этим утром я скопировал образ ВМ (150G, но 49G используется на диске )в ramfs
(. У меня 128G ОЗУ ). Это сработало. Но когда я скопировал из в ramfs
в место назначения, моя система перестала отвечать. Утилита cp
, по-видимому, заполнила пробелы в чтении , но не в записи.
И tmpfs
, и ramfs
могут вести себя иначе, чем реальная файловая система ext4
. Этого можно избежать, создав блочное устройство в ОЗУ и инициализировав его с помощью ext4
.
Для более глубокого сравнения -:https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
tmpfs
может использовать подкачку, которую Вы, вероятно, не хотите в чистом псевдодиске. – palswim 17.08.2017, 20:55