Перемещение открытого файла на другое устройство

У меня есть приложение, которое создает большой (~ 200 ГБ) выходной файл и занимает около 35 часов для запуска (в настоящее время я занял около 12 часов). Приложение просто открывает файл один раз, после чего сохраняет его открытым, пока он записывается, пока он не будет завершен; приложение также выполняет много произвольного доступа к файлу (т. е. не выполняет последовательную запись).

Сейчас файл сохраняется на моем локальном жестком диске, но я решил, что когда все будет готово, я перейду на другое устройство (сетевой диск, NTFS, смонтированный через SMB).

Чтобы сэкономить время, а не переместить файл позже, можно ли каким-то образом приостановить программу и каким-то образом переместить текущий частично полный файл на другое устройство, сделать некоторые трюки и возобновить программу, чтобы теперь она использовала новое местоположение?

Я почти уверен, что ответ – нет, но я думал, что спрошу, иногда есть удивительные трюки …

3 Solutions collect form web for “Перемещение открытого файла на другое устройство”

Публикация другого решения, поскольку файл записывается случайным образом, ломает мою идею tail . Мышление rsync может быть перспективным здесь, поскольку rsync может работать с использованием алгоритма дельта-передачи, сохраняя время передачи, отправив только измененные части файла. Если вы запустите rsync в двух локальных файлах, по умолчанию будет --whole-file режим --whole-file , который вам не нужен.

Советовать

 rsync -av --inplace --no-whole-file /your/local/file.dat /your/remote/file.dat 

… или, может быть (если крепление CIFS не согласуется с дельта-передачей), используйте pure rsync :

 rsync -av --inplace --no-whole-file /your/local/file.dat remoteserver:/your/directory/file.dat 

Таким образом, вы будете запускать это несколько раз, пока ваш 200-гигабайтный файл заполняется. Каждый раз, когда вы запускаете его, он постепенно обновляет удаленный файл. Это должно даже работать, когда исходный файл обновляется случайным образом. Может быть, вы можете запустить это каждые 15 минут. Затем, когда ваш pid закончится, вы запустите его еще раз, и это будет просто инкрементная дельта.

Предполагая, что сетевой диск установлен (NFS или что-то еще)

 tail -f -c1000000000000 /your/local/file.dat > /mnt/nfs/drive/file.dat 

Это начнет копирование вашего выходного файла на сетевой диск и синхронизация. Когда ваша программа заканчивается, вы должны увидеть тот же файл размером 200 ГБ на локальном и сетевом fs. Возможно, сделать md5sum для проверки.

Некоторые Unix-вкусы могут также поддерживать также tail с --pid={Your pid here} который автоматически остановит хвост, когда ваш pid закончит.

Вы можете попробовать:

  1. Приостановите свое приложение strg+z
  2. Перейти к каталогу, в котором создается файл cd CURRENT_CREATION_DIR
  3. Переместите сгенерированный файл в новое место mv FILE /path/to/new/location/
  4. Создайте символическую ссылку на файл в новом месте ln -s /path/to/new/location/FILE
  5. Продолжить ваше приложение fg [ENTER]

ВНИМАНИЕ:
Возможно, вам нужно запустить второй экземпляр вашей программы, сформировать тестовый файл и сначала протестировать вышеуказанные шаги в тестовом файле. Я не знаю, хорошо ли ваше приложение с символической ссылкой и просто продолжается. Возможно, программа не работает.

  • Альтернативное решение для создания нескольких копий одного файла с помощью командной строки?
  • Я хочу перечислить все файлы на моем Linux-сервере, которые старше 31 декабря 2014 года.
  • file (1) завершение команды при использовании опции -f -
  • Как создать несколько файлов в текущем каталоге в bash?
  • Собирайте файлы из нескольких разных каталогов и помещайте их в одно место
  • Для чего полезны иноды?
  • Кластеризация идентичных файлов, игнорирующих пробелы и разрывы строк
  • find: как игнорировать путь?
  • Идентификатор файла, который не изменяется при переименовании
  • Почему grep перезагружает компьютер?
  • Выполнение команды с несколькими входами для многих файлов
  • Как получить количество ссылок на файлы в папке с этими ссылками?
  • Linux и Unix - лучшая ОС в мире.