Ao tentar fazer o multiprocessamento com o arcpy, ocasionalmente, encontro esse erro:
FATAL ERROR (INFADI)
MISSING DIRECTORY
Não tenho idéia do que está desencadeando esse erro e ele trava o processo python, tornando impossível obter um rastreio nele. Isso ocorre ao gravar a saída raster final de um modelo de som demorado.
Às vezes é acompanhado por um erro
Unable to write BND file for %TEMP%\ras####
Onde% Temp é analisado corretamente e #### é um número aleatório de 4 dígitos. Isso é incomum porque cada processo possui seu próprio espaço de trabalho, onde é onde a maioria dos arquivos deve ser gravada.
O problema não são os dados de entrada ... Posso executar o programa novamente nas entradas com falha e ele será executado corretamente.
arcpy
arcgis-10.0
parallel-processing
blord-castillo
fonte
fonte
Respostas:
Aqui estão algumas coisas para verificar:
Você está usando cursores? Você está liberando eles? Você está tentando reutilizar objetos em diferentes processos? Você está compartilhando o mesmo local temporário? Você está fazendo no processamento de memória?
Em geral, o arcpy é apenas um invólucro em torno dos objetos com e qualquer tipo de multiprocessamento será complicado.
fonte
Descobri que esse problema surge quando o arcpy.env.workspace e o arcpy.env.scratchWorkspace são iguais para dois processos diferentes. O Arc grava quase todos os rasters intermediários no espaço de trabalho (ou espaço de trabalho de rascunho) no formato ESRI GRID. Não é possível gravar duas rasters ESRI GRID no mesmo diretório ao mesmo tempo devido à estrutura de pseudo-banco de dados do formato (a pasta info contém chaves exclusivas para cada varredura).
Evitei esse erro atribuindo espaço de trabalho exclusivo e espaço de trabalho a zero para cada processo usando uma pasta temporária tempfile.mkdtemp.
fonte
Eu encontrei isso também e ainda não encontrei uma correção de som. Minha solução é 1) para garantir que a tarefa de multiprocessamento seja robusta o suficiente para verificar se as tarefas estão concluídas ou não e criar uma nova lista de tarefas. 2) agende dois scripts para serem lançados a cada 10 a 15 minutos. Um script contém um comando para eliminar os processos python selecionados e o segundo relança o script de multiprocessamento desejado. Essencialmente, isso atualiza o pool de multiprocessamento. O script kill é algo como isto:
Cada lançamento do script desejado eu tenho que escrever seu PID em um CSV.
fonte
Devo admitir que estou neste momento, apenas um aspirante a multithreading, mas um blog em https://pythongisandstuff.wordpress.com/2013/07/31/using-arcpy-with-multiprocessing-%E2%80%93-part -3 / sugere que integrar a
arcpy.Exists()
função é essencial para que isso aconteça.fonte
Descobri que estava recebendo o erro INFADI ao tentar fazer com que vários threads / núcleos salvassem e modificassem rasters em uma pasta. A atribuição de uma subpasta a cada tarefa para saídas parece resolver o problema. Acredito que o problema tenha a ver com várias leituras / gravações em arquivos periféricos associados à varredura (por exemplo, a pasta "info"). Agora também uso as seguintes precauções:
fonte