Acelerar a pesquisa de arquivos em um caminho de rede

2

Estou tentando pesquisar em um caminho de rede dentro de uma pasta de 152.000 documentos, a lista de arquivos a serem pesquisados é 1500, depois de 5 horas ele encontrou apenas 50 documentos.

Este script foi escrito por outro usuário que me ajudou. Estou tentando ver se há alguma maneira de acelerar:

@echo off
for /f "usebackq delims=" %%a in ("C:\cleanup\addr.txt") do (
for /r "Z:\Attachments\PDF\" %%b in ("%%a*") do xcopy "%%b" "C:\cleanup\XMLFix\%%~pb" /s
)
pause

Eu acho que este script está pegando o primeiro nome de arquivo pesquisando através de 152.000 documentos até encontrar correspondências e depois procura 152.000 documentos pelo segundo documento e assim por diante.

Ela pode ser escrita de tal forma que armazene todos os nomes de arquivo no buffer e apenas pesquise os 152.000 documentos uma vez?

    
por Depak 30.04.2014 / 01:47

2 respostas

2

Isso não foi testado, mas acho que vai funcionar, e deve ser relativamente rápido. Com base no seu método atual, levando ~ 6 minutos por arquivo, prevejo que esse método leve menos de 10 minutos para ser concluído. Ele lê a hierarquia de pastas inteira apenas uma vez e, em seguida, verifica o resultado em todas as entradas do addr.txt em uma única passagem.

@echo off
pushd "c:\cleanup"

:: Prepare addr.txt to be used as /g option for FINDSTR
(for /f "usebackq delims=" %%F in ("addr.txt") do echo \%%~nxF) >addr.txt.mod

:: Get a list of full paths to all files in hierarchy
dir /b /a-d /s "z:\attachments\pdf\*" >files.txt

:: Match files in files.txt against files in addr.txt.mod
for /f "delims=" %%F in ('findstr /ileg:addr.txt.mod files.txt') do (
  REM %%F contains the full path of a matching file
  xcopy "%%F" "C:\cleanup\XMLFix%%~pF"
)

:: Delete temp files
del addr.txt.mod files.txt

popd
    
por 30.04.2014 / 06:21
0

Isso realmente ficará muito lento com um conjunto de loops for, pelo simples motivo de que, mesmo quando encontrar um arquivo, ele continuará a procurar o mesmo arquivo no restante dos 152000 documentos. Portanto, o tempo gasto é de 1500 x 152000.

Um VBScript pode fazer isso muito mais rápido porque você pode sair de um loop.

O todo pode ser otimizado mesmo se a lista de arquivos puder ser reduzida a seções nas quais ele não pesquisará tudo se você souber de antemão que os arquivos não estarão em um local específico, mas isso pode não ser necessário.

Por último, dado que fazer isso através de uma rede irá desacelerar as coisas incrivelmente, pode ser uma boa coisa para copiar todos os 152000 documentos localmente e realizar a pesquisa e copiar lá.

Se você escrever um VBScript e tiver que fazer isso pela rede, verifique se o VBScript edita a lista de arquivos e remove todos os arquivos da lista que já encontrou. Isso garantirá que você possa interromper o script a qualquer momento e retomar mais tarde.

Embora o SuperUser não seja um serviço de escrita de argumentos, ajudarei você a fornecer os comandos de que precisará:

' Copy files to...
sDestination = "c:\some\path"

' get filenames in folder
sPath = "c:\some\path"
Set fso = createobject("Scripting.FileSystemObject")
Set oFolderContent = fso.GetFolder(sPath)

' open textfile and read its content
set oFileList = fso.OpenTextFile(sFilename, 8, false)

' Loop to go through all files in a folder
For Each oFile In oFolderContent.files
' Loop to go through all folders in a folder
For Each oFile In oFolderContent.folders

'break out of a for loop
exit for

'copy a file
fso.CopyFile oFile, sDestination

Se isso for muito complexo, sugiro obter ajuda no Stack Overflow.

    
por 30.04.2014 / 02:29