Удаленная копия LMDB

0

Я хочу перенести LMDB с моего локального компьютера на другой удаленный компьютер, но с размером файла есть некоторые странности. Согласно файловой системе, LMDB - это каталог, содержащий два файла: data.mdb и lock.mdb.

Вывод ls -altoh lmdbуказывает, что файл data.mdb имеет размер 4T, что соответствует параметру map_size, который я использовал для создания LMDB. Все это означает, что при открытии БД ОС будет отображать файл в памяти, предоставляя ему 4T виртуального пространства. Вывод du -hs lmdbуказывает, что lmdb занимает ~ 900 МБ диска, что согласуется с сообщением map_size python -mlmdb -e lmdb stat.

Когда я делаю локальную копию cp -r lmdb lmdb_copy, она работает как положено: копируется 900 МБ данных. То же самое, когда я делаю scp -r lmdb lmdb_copy2(используя scp для локального копирования).

Однако, когда я делаю удаленное копирование scp -r lmdb user@remotehost:~/lmdb_copy, scp пытается скопировать 4T данных, как указано индикатором выполнения. Я остановил scp после того, как 2 ГБ данных были переданы.

На удаленной машине 'lsи du2 ГБ как размер LMDB. python -mlmdb -e lmdb_copy statсообщает правильный размер 900 МБ и что все записи есть. Я подтвердил, что могу распечатать все ключи, и они верны.

С этим фоном у меня возникает вопрос: почему scp пытается скопировать все 4T размера карты памяти? В идеале, я хотел бы позволить scp делать свою работу в фоновом режиме, не убивая ее вручную.

waldol1
источник

Ответы:

1

Вы можете попробовать использовать rsync для копирования. Он говорит, что имеет дело с разреженными файлами. Что-то вроде

rsync --rsh=ssh --archive --sparse lmdb user@remotehost:~/lmdb_copy

Кроме того, и некоторое понимание того, почему scp работает локально, а не по сети, когда scp видит, что это локальное копирование, он просто передает запрос команде cp напрямую. Отслеживая системные вызовы команды scp, я поймал это, делая это

execve("/bin/sh", ["sh", "-c", "exec cp -r foo bah"], [/* 20 vars */])
Mykel
источник
Спасибо, я попробую это. Я обнаружил, что функция mdb_copy будет локально копировать lmdb, чтобы файл не был разреженным ( lsотображал правильный размер файла), чтобы scp работал как положено.
waldol1
Хм, это работало лучше, но все еще не то, что я хочу. Передано чуть более 900 МБ (971 МБ) данных (как показано на ls / du на удаленном компьютере), но rsync все еще работал (и сообщал о нелепых скоростях передачи 1000 ГБ / с), даже несмотря на то, что размер файла на удаленном компьютере перестал расти.
waldol1
rsync сообщил, что скорость передачи данных пытается показать вам чистую скорость, поэтому он будет высоким для разреженных файлов (так же, как для разделов «без изменений»). Ты позволил rsync закончить?
Микель