Por que escrever no meu NAS em pequenos trechos é tão lento?

2

Acabei de descobrir que o gargalo de um script Python estava escrevendo um arquivo de texto sem buffer linha por linha para o nosso QNAP NAS. Veja o snippet em anexo do Python. Isto é necessariamente tão lento ou há algo de errado com a nossa configuração de rede QNAP?

# local SSD: 2 seconds
with open(r'C:\Daten\numbers.txt', 'w') as f:

# local SSD with buffering: 2 seconds
with open(r'C:\Daten\numbers.txt', 'w', buffering=2**20) as f:

# Share on QNAP NAS: ### 36 ... 61 seconds! ###
with open(r'I:\numbers.txt', 'w') as f:

# Share on QNAP NAS with buffering: 2 ... 3 seconds
with open(r'I:\numbers.txt', 'w', buffering=2**20) as f:
    for i in range(1000000):
        print(i, file=f)
    
por Redoute 10.11.2017 / 15:36

1 resposta

2

Qualquer pequena E / S será cara em comparação com transferências maiores. Neste caso, a situação é agravada por:

  • usando E / S sem buffer
  • enviando dados para a rede em vez de um barramento local rápido
  • usando um protocolo de sistema de arquivos remoto (ou seja, CIFS ou NFS).

Embora você possa melhorar o desempenho ajustando o comportamento do servidor NFS / CIFS / SMB, sugiro que você evite E / S genéricas sem buffer em favor de E / S armazenada em buffer + pontos de liberação explícitos (se exigido pelo aplicativo ).

    
por 10.11.2017 / 16:11