LinuxForum.Fans
Тема

RAM диск и большие файлы

Автор: Vascom 24 сообщений 1534 просмотров
27.01.2015 09:57 #411472

Кто-нибудь знает как можно реализовать такое: использовать RAM диск как буфер для записи на жёсткий диск?

То есть, к примеру, есть RAМ диск на 2ГБ. Программа генерирует медленно файл размером 6ГБ. Хочется чтобы сперва файл писался в RAM-диск, а потом скопом сбрасывался на жёсткий диск. Но файл чтобы был непрерывным.

27.01.2015 10:08 #411476
Vascom написал:
Кто-нибудь знает как можно реализовать такое: использовать RAM диск как буфер для записи на жёсткий диск?

То есть, к примеру, есть RAМ диск на 2ГБ. Программа генерирует медленно файл размером 6ГБ. Хочется чтобы сперва файл писался в RAM-диск, а потом скопом сбрасывался на жёсткий диск. Но файл чтобы был непрерывным.

Ничего умнее как организовать на RAM очередь FIFO мне не приходит.

27.01.2015 10:10 #411477

А как это сделать попроще? Может на bash.

27.01.2015 10:29 · отредактировано #411483
"Vascom" написал:
То есть, к примеру, есть RAМ диск на 2ГБ. Программа генерирует медленно файл размером 6ГБ. Хочется чтобы сперва файл писался в RAM-диск, а потом скопом сбрасывался на жёсткий диск. Но файл чтобы был непрерывным.
оно так УЖЕ реализовано.

Но вы конечно можете навелосипедить что-то типа этого:

1. создаём рамдиск, т.е. у меня так:
text
tmpfs                    /tmp               tmpfs       nodev,nosuid,size=700M                 0 0

2. пишем туда файл

3. останавливаем запись в файл, вынимаем командой dd(UPD можно head(1) вместо dd) первые N байт файла, и добавляем в хвост файла на HDD

4. тоже командой dd копируем хвост в другой файл на tmpfs (UPD можно tail(1))

5. удаляем исходный файл из tmpfs

6. возобновляем запись уже в новый файл

Этот самый "хвост" можно сделать маленьким, тогда п4 будет очень быстрым.

А зачем это извращение нужно?

"Vascom" написал:
А как это сделать попроще? Может на bash.

[console]man 1 mkfifo[/console]
только я не уверен, что вам именно это нужно.

27.01.2015 10:30 #411484

Ну вот остановить запись в файл я не могу. Если только останавливать работу программы, но тогда теряется весь смысл.
Да так, думал может это ускорит работу приложения, если жёсткий диск не будет постоянно дёргаться. Но, видимо, овчинка выделки не стоит и системный кеш и так нормально работает.

27.01.2015 10:38 #411486
"Vascom" написал:
Ну вот остановить запись в файл я не могу.
на самом деле можно

1. остановить работу программы, типа как вы посылаете ей ^Z (suspend)

2. подменить ей файл назначения

3. продолжить исполнение

"Vascom" написал:
думал может это ускорит работу приложения

Нет. Проблема в том, что программа УЖЕ пишет в файл. А если она использует не буфферезированную запись, значит тому есть весомая причина. Если причин нет, используют буфферезированную запись, когда данные сначала поступают в буфер в RAM, и лишь когда их там накопится много, они пишуться на HDD.

"Vascom" написал:
Но, видимо, овчинка выделки не стоит
ну только ессли программу пейсал криворукий быдлокодер. И то, в этом случае проще программу переделать, либо найти другую.
27.01.2015 10:42 · отредактировано #411488

Программа проприетарная и профессиональная, другую найти нельзя.
А можно как-нибудь этим кешем в ОЗУ порулить? Просто оперативки тут много (есть машины с 288ГБ и 768ГБ). Пока пробую чисто в RAM диск писать, скоро будет видно есть прирост скорости или нет.

P.S. Соответственно файлы не 6ГБ как в примере, а 10-100ГБ.

27.01.2015 11:07 #411492

"Vascom" написал:
А можно как-нибудь этим кешем в ОЗУ порулить?
AFAIK можно, но только из самой программы.

В вашем случае возможно поможет костыль, в который будет писать ваша программа, и такой костыль лучше всего писать на сишке. На питоне/баше конечно в принципе тоже можно, но не думаю, что из этого будет какой-то выигрыш.

Костыль мне видится таким:

1. костыль создаёт named pipe с помощью mkfifo(3)

2. ваша программа пишет в этот named pipe

3. костыль время от времени вынимает по N байтов из пайпа, и кидает эти байты на HDD.
27.01.2015 11:11 #411493

Ясно, спасибо за ответы.

27.01.2015 11:17 #411497

и да, задача специфическая, её решение зависит от многих неизвестных. ИМХО проще самому написать костыль, который идеально вам подойдёт. Готовых решений вы вряд-ли найдёте.

Напоследок добавлю, что костыль обязательно должен делать sync, либо использовать НЕ буферизируюмую запись на HDD. Два кеша не имеют смысла.

27.01.2015 12:07 #411507
Vascom написал:
Кто-нибудь знает как можно реализовать такое: использовать RAM диск как буфер для записи на жёсткий диск?

То есть, к примеру, есть RAМ диск на 2ГБ. Программа генерирует медленно файл размером 6ГБ. Хочется чтобы сперва файл писался в RAM-диск, а потом скопом сбрасывался на жёсткий диск. Но файл чтобы был непрерывным.

Что-то я ничего не понял. Файл и так сначала буферизуется в RAM сколько может. Всё это сильно напоминает популярный у конкурентов баян про swap в ram :) Что требуется - реализовать что-то типа транзакции с шансом undo?

27.01.2015 12:08 #411508

Нет, транзакции и undo не нужны.
А вот сколько это "сколько сможет"?

27.01.2015 12:39 · отредактировано #411522
"Vascom" написал:
А вот сколько это "сколько сможет"?

https://www.kernel.org/doc/Documentation/sysctl/vm.txt

Смотрите параметры, начинающиеся с dirty (dirty data - это данные, которые изменились в кеше, но еще не записаны на диск). Изменяя их, вы можете сделать то, что хотите, без костылей. Но, имхо, не стоит сильно увлекаться увеличением.

27.01.2015 13:05 #411525
Vascom написал:
Нет, транзакции и undo не нужны.
А вот сколько это "сколько сможет"?

Ну тогда быстрее не будет, особенно если данные поступают медленно.
Про "сколько сможет" вам уже объяснили, но тут система и без доп настроек уже поступает достаточно разумно. Разве что - пишется на что-то совсем медленное, например на флешку usb2.

27.01.2015 15:01 #411545

"Vascom" написал:
А вот сколько это "сколько сможет"?
по дефолту оно всю память забивает AFAIK.
27.01.2015 15:25 #411556

Ну не всю. У меня постоянно 100ГБ не используемые, ни под кеш, ни под буферы.
Гораздо быстрее сбрасывает на диск.

27.01.2015 17:31 #411579

"Vascom" написал:
У меня постоянно 100ГБ не используемые
настройки надо подкрутить видимо. Очевидно дефолт для более меньших объёмов RAM.
28.01.2015 04:47 · отредактировано #411694
"Vascom" написал:
Хочется чтобы сперва файл писался в RAM-диск, а потом скопом сбрасывался на жёсткий диск.

не особо понял, а какова цель всего этого цирка?

28.01.2015 07:26 · отредактировано #411712

Цель вот какова: программа работает и выводит результат на экран, при этом одновременно пишет данные в файл (данные гораздо больше, чем результат на экране). По результатам работы программы иногда приходится смотреть записанный файл, но результат требуется получить как можно раньше. Понятно, что запись данных тормозит работу программы.
Идеей было чтобы программа быстро отработала, а потом уже сбрасывала данные на жёсткий диск.

После теста выяснил, что выигрыш невелик: при работе с жёстким диском время выполнения было 4 часа 20 минут, а при работе с RAM диском 4 часа. При этом файл данных был 40ГБ.

28.01.2015 07:45 #411719
"Vascom" написал:
Понятно, что запись данных тормозит работу программы.

нуда... уже объяснили, что не тормозит.... если конечно не сделать ничего странного вроде mount -o sync...
думал может быть цель была уменьшить фрагментацию файла...

"Vascom" написал:
После теста выяснил, что выигрыш невелик: при работе с жёстким диском время выполнения было 4 часа 20 минут, а при работе с RAM диском 4 часа.

можно списать на случайное отклонение….

Войдите или зарегистрируйтесь, чтобы ответить.