2014-01-30 3 views
1

У меня есть файл журнал Source.txt с следующим содержанием-структурой:Повышайте скорость пакетной обработки

Handle v3.51 
Copyright (C) 1997-2013 Mark Russinovich 
Sysinternals - www.sysinternals.com 

------------------------------------------------------------------------------ 
DataSource.exe pid: 5860 USER\DEVELOPMENT 
    5EC: File (R--) G:\apps\OracleClient\product\11.1.0\client_2\RDBMS\mesg\ocius.msb 
    600: File (R--) G:\apps\OracleClient\product\11.1.0\client_2\RDBMS\mesg\ocius.msb 
    614: File (R--) G:\apps\OracleClient\product\11.1.0\client_2\RDBMS\mesg\ocius.msb 
    628: File (R--) G:\apps\OracleClient\product\11.1.0\client_2\RDBMS\mesg\ocius.msb 
    834: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP1_RulesLogFiles\1-28-2014_Timer.log 
    838: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP1_RulesLogFiles\1-28-2014_Debug.log 
    854: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP1_RulesLogFiles\1-28-2014_Timer.log 
    858: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP1_RulesLogFiles\1-28-2014_Debug.log 
    874: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP1_RulesLogFiles\1-28-2014_Timer.log 
    878: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP1_RulesLogFiles\1-28-2014_Debug.log 
1058: File (RW-) C:\Windows\winsxs\amd64_microsoft.vc80.atl_1fc8b3b9a1e18e3b_8.0.50727.4053_none_8a1a02152edb659b 

------------------------------------------------------------------------------ 
DataSource.exe pid: 10568 USER\DEVELOPMENT 
1074: File (RW-) C:\Windows\winsxs\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_none_88e046c92fae6f57 
1078: File (RW-) C:\Windows\winsxs\amd64_microsoft.vc80.atl_1fc8b3b9a1e18e3b_8.0.50727.4053_none_8a1a02152edb659b 
    8F4: File (RW-) C:\Windows\winsxs\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_none_88e046c92fae6f57 
    908: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP2_RulesLogFiles\1-28-2014_Timer.log 
    90C: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP2_RulesLogFiles\1-28-2014_Debug.log 
    928: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP2_RulesLogFiles\1-28-2014_Timer.log 
    92C: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP2_RulesLogFiles\1-28-2014_Debug.log 
    948: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP2_RulesLogFiles\1-28-2014_Timer.log 
1064: File (RW-) C:\Windows\winsxs\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_none_88e046c92fae6f57 
1068: File (RW-) C:\Windows\winsxs\amd64_microsoft.vc80.atl_1fc8b3b9a1e18e3b_8.0.50727.4053_none_8a1a02152edb659b 
    | | 
    | | 
    | | 
and so on...... 

Я хотел достичь следующего:

  1. Искать 1 вхождение «DataSource .exe ', а затем выполните поиск для 1-го вхождения любого из слов среди (APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9) и предположим, что найденное слово APP1 отправит следующий файл в файл' Output.txt ':

    DataSource.exe pid: 5860 USER\DEVELOPMENT APP1 
    
  2. Тогда поиск 2 вхождения «DataSource.exe», а затем поиск снова для 1-го возникновения какого-либо одного слова среди (APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9) [Мы можем отбросить слово, которое уже нашло] и давайте предположим app2 слово найдено, то добавьте следующий вывод в тот же файл 'output.txt':

    DataSource.exe pid: 10568 USER\DEVELOPMENT APP2 
    

    и так далее ..

Я нахожусь используя ниже рабочего сценария:

@ECHO OFF 
setlocal enabledelayedexpansion 
SET "keystring1=" 
(
FOR /f "delims=" %%a IN (
    Source.txt 
) DO (
    ECHO %%a|FIND "DataSource.exe" >NUL 
    IF NOT ERRORLEVEL 1 SET keystring1=%%a 
    FOR %%b IN (APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9) DO (
    ECHO %%a|FIND "%%b" >NUL 
    IF NOT ERRORLEVEL 1 IF DEFINED keystring1 CALL ECHO(%%keystring1%% %%b&SET "keystring1=" 

)))>Output.txt 

GOTO :EOF 

Проблема:

Проблема я испытываю здесь для Source.txt file of size 312 KB, Этот сценарий принимает 4 minutes to produce Output.txt даже только для тех 9 АРР, который, кажется, довольно большой время.

Я хочу уменьшить это время так или иначе, без использования дополнительного пакетного файла. любой обходной путь пожалуйста?

* Точные имена приложений отличаются от APP1, APP2 ... и т. Д.

+0

Вместо поиска процесса, а затем определить, какие файлы есть его открытым, перечислить файлы ('dir') и для каждого из них определить процесс, который он заблокирован (' ручка File') –

ответ

0

Ваш вторичный поиск может занять некоторое время - где %%a проверяется на APP1.. APP2.. etc. Вы можете создать второй командный файл, чтобы вызвать этот файл с разными параметрами, запуская их параллельно.

Если ваш скрипт называется script.bat, создать второй скрипт, который делает следующее -

START script.bat APP1 APP2 APP3 
START script.bat APP4 APP5 APP6 
START script.bat APP7 APP8 APP9 

Затем изменить сценарий, чтобы включить параметры ввода.

@ECHO OFF 
setlocal enabledelayedexpansion 
SET "searchvals=%*" 
SET "keystring1=" 
(
    FOR /f "delims=" %%a IN (Source.txt) DO (
     ECHO %%a|FIND "DataSource.exe" >NUL 
     IF NOT ERRORLEVEL 1 SET keystring1=%%a 
     FOR %%b IN (%searchvals%) DO (
      ECHO %%a|FIND "%%b" >NUL 
      IF NOT ERRORLEVEL 1 IF DEFINED keystring1 CALL ECHO(%%keystring1%% %%b&SET "keystring1=" 
)))>Output.txt 

EXIT 

Таким образом, каждый экземпляр сценария только сравнивает каждую строку Source.txt против трех строк, в отличии от 9.

Надеется, что это на самом деле помогает. Обратите внимание, что содержимое Output.txt, вероятно, не будет в порядке.

+0

@ unclement..Это действительно хорошее решение, но, к сожалению, я ограничен для создания любого другого командного файла. Я должен достичь только одного сценария партии. – Sunny

0

Это использует вспомогательный командный файл findrepl.bat - скачать с: https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

Место findrepl.bat в той же папке, что и пакетный файл или на пути.

@echo off 
for %%a in (APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9) do (
type "source.txt" |findrepl "DataSource.exe" /e:"^-----" /b:"%%a" |findrepl /o:1:1 2>nul 
) 
pause 
+0

@ foxi..perfect хелпер файл - это..изменительно ..! но мне не разрешено использовать какой-либо другой пакетный файл. я должен добиться всего лишь одного командного файла ... любая помощь, пожалуйста? – Sunny

+0

Как интересно, какое улучшение скорости вы получаете от этого решения, Sunny? – foxidrive

0
@echo off 
setlocal EnableDelayedExpansion 

(for /F "tokens=1-5* delims=\ " %%a in ('findstr "DataSource.exe APP" Source.txt') do (
    if "%%a" equ "DataSource.exe" (
     set pid=%%a %%b %%c %%d\%%e 
     set "APP=" 
    ) else if not defined APP (
     set "APP=%%f" 
     set "APP=!APP:*APP=!" 
     echo !pid! APP!APP:~0,1! 
    ) 
)) > Output.txt 

goto :EOF 
+0

@ Aacini .. вы также согласитесь со мной, что мы должны быть более обобщенными, так как моя главная проблема с увеличением скорости связана с тем, что в будущем можно легко добавить больше приложений с разными именами. – Sunny

Смежные вопросы