Удаленная копия 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_copyscp пытается скопировать 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 */])
Другие вопросы по тегам