Удаленная копия LMDB
Я хочу перенести 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
а также du
оба 2 ГБ в качестве размера LMDB. python -mlmdb -e lmdb_copy stat
сообщает правильный размер 900 МБ и что все записи есть. Я подтвердил, что могу распечатать все ключи, и они верны.
С этим фоном у меня возникает вопрос: почему scp пытается скопировать все 4T размера карты памяти? В идеале, я хотел бы позволить scp делать свою работу в фоновом режиме, не убивая ее вручную.
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 */])