Я хочу перенести 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 ответ1

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 */])

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .