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

У меня есть приложение, которое создает большой (~ 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]

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

  • Как ограничить скорость копирования файлов?
  • Почему пользователи могут удалять файлы друг друга в этом случае
  • Как архивировать структуру dir, игнорируя файлы и диски без разрешения на чтение
  • Сделать файлы доступными через локальный адрес
  • Можете ли вы прочитать обновленное mtime, но при чтении содержимого они еще не обновлены?
  • Как быстро найти 20 последних измененных файлов в Mac OS X (вместо использования Python)?
  • Чтение содержимого файла ELF (программно)
  • Используйте rsync для сравнения удаленного каталога с локальным и сохраните различия в другом локальном каталоге
  • Сценарий оболочки: «если файл не используется»
  • Неверная команда zip испортила мою директорию проекта
  • как получить последний файл в каждом каталоге
  • Linux и Unix - лучшая ОС в мире.