Ir ao conteúdo

Posts recomendados

Postado

senhores, tudo bem?

estou implementando um método de classe pequena, e me deparei com uma dúvida, qual a forma mais otimizada de cópia para windows e linux? principalmente windows.

seria essa?

 

    def try_copy(self, src: str, dst: str, max_attempts: int = 3) -> bool:
        attempts = 0
        while attempts < max_attempts:
            try:
                if system() == 'Windows':
                    call(["robocopy", src, dst, "/MT:16", "/J", "/NP"])
                else:
                    call(["rsync", "-a", src, dst])
                print(f"""
                ⇘\tsuccessfully transferred\n
                """)
                return True
            except Exception as e:
				...
        return False

 

ou essa?

    def try_copy(self, src: str, dst: str, max_attempts: int = 3) -> bool:
        attempts = 0
        while attempts < max_attempts:
            try:
            O_BINARY = os.O_BINARY
            except:
            O_BINARY = 0

            READ_FLAGS = os.O_RDONLY | O_BINARY
            WRITE_FLAGS = os.O_WRONLY | os.O_CREAT | os.O_TRUNC | O_BINARY
            BUFFER_SIZE = 128*1024

            fin = os.open(src, READ_FLAGS)
            stat = os.fstat(fin)
            fout = os.open(dst, WRITE_FLAGS, stat.st_mode)
            for x in iter(lambda: os.read(fin, BUFFER_SIZE), ""):
            os.write(fout, x)
                return True
            except Exception as e:
				...
        return False

 

Postado

A primeira vai depender do algoritmo implementado por cada sistema, já que você está chamando comandos do sistema. Na minha opinião ela deve ser a mais rápida, já que a segunda é implementada apenas em Python e a linguagem é conhecida por ser lenta.

Se você quiser, pode usar também a função copy da lib shutil. Ou olhar a implementação: https://github.com/python/cpython/blob/main/Lib/shutil.py#L230

  • Amei 1
Postado

@Kamuri Mestre kamuri, que saudade.
Então... tentei com o copy,copyfile e copy2 do shutil, mas ambos são muito lentos em comparação com outras tentativas (kernel, write, etc) e possuem alguns bugs quando a transferência ultrapassa 40GB.

Postado

@Swalls consegue enviar esses códigos funcionando? Vai ficar mais fácil pra testar sem eu alterar algo que deveria fazer parte deles.

Testei o copyfile do shutil:

Um arquivo .zip de 114GiB demorou 22 minutos para ser copiado de um HDD para outro

Postado

@Kamuri Bom dia mestre kamuri.
Então.. o codigo original tem mais de 300 linhas e não tem muita relação com a dúvida.
O robocopy foi o mais rápido até o momento, porém ele produz muito texto no console, e como eu faço a transferência usando ThreadPoolExecutor, acaba que fica um emaranhado de texto no console. (mas isso não vem à duvida)

 

coloquei como função, espero que ajude.

from os.path import basename, dirname
from subprocess import call
from shutil import copy, copy2, copyfile

def try_copy(src: str, dst: str, max_attempts: int = 3) -> bool:
  attempts = 0
  while attempts < max_attempts:
    try:
      if system() == 'Windows':      
        name = basename(src)
        src = dirname(src)
        #copy(src,dst)
        #copy2(src,dst)
        #copyfile(src,dst)
        call(["robocopy", src, dst, name, "/MT:16", "/J", "/np", "/njh", "/njs", "/nc", "/eta"])
      else:
        call(["rsync", "-a", src, dst])
      return True
    except Exception as e:
      attempts += 1
      print(f"Attempt {attempts} to copy {src} to {dst} failed: {e}")
  print(f"""Failed to copy {src} to {dst} after {max_attempts} attempts.
  return False

 

  • Curtir 1
Postado

@Swalls Rodando aqui levou cerca de 28 minutos, o que não é muito diferente do copyfile da shutil. Não notei nenhum dos problemas que você mencionou 😕.

Mesmo arquivo, de um HDD para outro.

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...