1

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

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

2

Vascom пишет:

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

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

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

3

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

4 (27.01.2015 10:30:20 отредактировано drBatty)

Vascom пишет:

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

оно так УЖЕ реализовано.

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

1. создаём рамдиск, т.е. у меня так:

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.

 Консоль:
man 1 mkfifo

только я не уверен, что вам именно это нужно.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

5

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

6

Vascom пишет:

Ну вот остановить запись в файл я не могу.

на самом деле можно

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

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

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

Vascom пишет:

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

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

Vascom пишет:

Но, видимо, овчинка выделки не стоит

ну только ессли программу пейсал криворукий быдлокодер. И то, в этом случае проще программу переделать, либо найти другую.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

7 (27.01.2015 10:43:09 отредактировано Vascom)

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

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

8

Vascom пишет:

А можно как-нибудь этим кешем в ОЗУ порулить?

AFAIK можно, но только из самой программы.

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

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

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

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

9

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

10

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

11

Vascom пишет:

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

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

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

12

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

13 (27.01.2015 12:39:54 отредактировано neol)

Vascom пишет:

А вот сколько это "сколько сможет"?

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

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

14

Vascom пишет:

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

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

15

Vascom пишет:

А вот сколько это "сколько сможет"?

по дефолту оно всю память забивает AFAIK.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

16

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

17

Vascom пишет:

У меня постоянно 100ГБ не используемые

настройки надо подкрутить видимо. Очевидно дефолт для более меньших объёмов RAM.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

18 (28.01.2015 04:47:50 отредактировано )

Vascom пишет:

Хочется чтобы сперва файл писался в RAM-диск, а потом скопом сбрасывался на жёсткий диск.

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

95% процентов проблем находятся между клавиатурой и стулом.

19 (28.01.2015 07:27:49 отредактировано Vascom)

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

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

20

Vascom пишет:

Понятно, что запись данных тормозит работу программы.

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

Vascom пишет:

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

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

95% процентов проблем находятся между клавиатурой и стулом.

21

Vascom пишет:

После теста выяснил, что выигрыш невелик

потому что IO уже много лет выполняется параллельно.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

22

Только это не "случайное отклонение", а каждый раз так.

23

а что за программа - числодробилка? С такими всегда было сложно конкурировать.

24

В принципе да. Симулятор работы логических схем.