LMDB的远程副本


0

我想将LMDB从本地计算机迁移到另一台远程计算机,但是文件大小有些奇怪。根据文件系统,LMDB是一个包含两个文件的目录:data.mdb和lock.mdb。

输出ls -altoh lmdb指示data.mdb的文件大小为4T,它与我用于创建LMDB的map_size参数匹配。所有这些意味着当数据库打开时,操作系统将对内存映射文件,为其提供4T的虚拟空间。输出du -hs lmdb表明lmdb占用了大约900MB的磁盘,这与报告的map_size一致python -mlmdb -e lmdb stat

当我执行本地副本时cp -r lmdb lmdb_copy,它按预期工作:复制900MB的数据。我这样做scp -r lmdb lmdb_copy2(使用scp做本地复制)。

但是,当我进行远程复制时scp -r lmdb user@remotehost:~/lmdb_copy,scp会尝试复制4T数据,如进度条所示。在转移2GB数据后我停止了scp。

在远程计算机上,'ls并且du两个2GB作为LMDB的大小。 python -mlmdb -e lmdb_copy stat报告正确的900MB大小,并且所有条目都在那里。我已经确认我可以打印出所有按键并且它们是正确的。

有了这个背景,我的问题是,为什么scp会尝试复制所有4T的内存映射大小?理想情况下,我想让scp在后台执行它的操作,而不必手动杀死它。

Answers:


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

谢谢,我会试试。我发现mdb_copy函数将本地复制lmdb,以便文件不稀疏(ls显示正确的文件大小),以便scp按预期工作。
waldol1 2015年

嗯,它效果更好,但仍然不是我想要的。传输了超过900MB(971MB)的数据(如远程计算机上的ls / du所示),但rsync仍在运行(并报告了1000GB / s的荒谬传输速率),即使远程计算机上的文件大小也是如此停止增加。
waldol1 2015年

rsync报告传输速率试图向您显示净速率,因此稀疏文件会变高(就像“无变化”部分一样)。你让rsync完成了吗?
mykel 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.