Cópia remota do LMDB

0

Eu quero migrar um LMDB da minha máquina local para outra máquina remota, mas há algumas estranhezas sobre o tamanho do arquivo. De acordo com o sistema de arquivos, um LMDB é um diretório contendo dois arquivos: data.mdb e lock.mdb.

A saída de ls -altoh lmdb indica que data.mdb tem um tamanho de arquivo de 4T, que corresponde ao parâmetro map_size que usei para criar o LMDB. Tudo isso significa que quando o banco de dados é aberto, o sistema operacional mapeará o arquivo, dando-lhe 4T de espaço virtual. A saída de du -hs lmdb indica que o lmdb está consumindo ~ 900MB de disco, o que está de acordo com o map_size informado por python -mlmdb -e lmdb stat .

Quando eu faço uma cópia local cp -r lmdb lmdb_copy , ele funciona como esperado: 900 MB de dados são copiados. O mesmo quando eu faço scp -r lmdb lmdb_copy2 (usando scp para fazer uma cópia local).

No entanto, quando eu faço uma cópia remota scp -r lmdb user@remotehost:~/lmdb_copy , scp tenta copiar 4T de dados, conforme indicado pela barra de progresso. Eu parei o scp depois que 2GB de dados foram transferidos.

Na máquina remota, 'ls e du ambos 2 GB como o tamanho do LMDB. python -mlmdb -e lmdb_copy stat informa o tamanho correto de 900MB e que todas as entradas estão lá. Eu verifiquei que posso imprimir todas as chaves e elas estão corretas.

Com este pano de fundo, minha pergunta é: por que o scp tenta copiar todos os 4T do tamanho do mapa de memória? Idealmente, eu gostaria de deixar o scp fazer sua coisa em segundo plano sem ter que matá-lo manualmente.

    
por waldol1 09.09.2015 / 19:07

1 resposta

1

Você pode tentar usar o rsync para fazer a cópia. Diz que lida com arquivos esparsos. Algo como

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

Como um aparte, e algumas dicas sobre por que o scp funciona localmente, mas não através de uma rede, quando scp vê que é uma cópia local para local, apenas passa a requisição para o comando cp diretamente. Monitorando as chamadas do sistema de um comando scp, eu peguei isso fazendo isso

execve("/bin/sh", ["sh", "-c", "exec cp -r foo bah"], [/* 20 vars */])
    
por 10.09.2015 / 13:43