The line set cyclezipPPMdd=%cyclezipPPMdd!cycleCount!%
in the code below isn't working as I intend to. It should transform !cycleCount!
as, for example, 1
, and then transform %cyclezipPPMdd!cycleCount!%
into cyclezipPPMdd1
and finally set cyclezipPPMdd
equal to the value of cyclezipPPMdd1
which is 256m
.
I need a rotating value in cyclezipPPMdd
.
rem @echo off
setlocal enableDelayedExpansion
: part1
set "cyclezipPPMdd0=256m 128m 64m 32m 16m 8m 4m 2m 1m"
set "memcyclezipPPMdd=258 130 66 34 18 10 6 4 3"
set /a anotherCounter=0
set tempCycle=!cyclezipPPMdd0: =^
!
for /f %%i in ("!tempCycle!") do (
set /a anotherCounter+=1
set cyclezipPPMdd!anotherCounter!=%%i
)
set /a cycleCount=0
: part2
set tempMem=!memcyclezipPPMdd: =^
!
for /f %%i in ("!tempMem!") do (
set /a cycleCount+=1
set tempMem!cycleCount!=%%i
set cyclezipPPMdd=%cyclezipPPMdd!cycleCount!%
set cyclezipPPMdd
pause
)
set /a anotherCounter=0
set /a cycleCount=0
pause
In the end I am so clueless as to what I need to do to achieve my goal. I'm not a programmer at all. Here's the final goal topic: for and start commands in a batch for parallel and sequential work
EDIT: the too long didn't read version
I need a way to split cyclezipPPMdd0=256m 128m 64m 32m 16m 8m 4m 2m 1m
into single pieces, like this:
cyclezipPPMdd0=256m 128m 64m 32m 16m 8m 4m 2m 1m
cyclezipPPMdd1=256m
cyclezipPPMdd2=128m
cyclezipPPMdd3=64m
cyclezipPPMdd4=32m
cyclezipPPMdd5=16m
cyclezipPPMdd6=8m
cyclezipPPMdd7=4m
cyclezipPPMdd8=2m
cyclezipPPMdd9=1m
Those values will directly affect how much memory will be in use by 7z.exe (explained in the other topic), and I need a way to keep track of how much memory is currently in use to determine if the remaining memory would allow me to run another instance of 7z.exe or not. When 7z.exe starts, it will use only one of these values at a time. However, 256m is a value of a parameter for 7z.exe, it is the dictionary size. The real memory usage by this parameter is 258, so, the associated values are like this:
cyclezipPPMdd1=256m <=> tempMem1=258
cyclezipPPMdd2=128m <=> tempMem2=130
cyclezipPPMdd3=64m <=> tempMem3=66
cyclezipPPMdd4=32m <=> tempMem4=34
cyclezipPPMdd5=16m <=> tempMem5=18
cyclezipPPMdd6=8m <=> tempMem6=10
cyclezipPPMdd7=4m <=> tempMem7=6
cyclezipPPMdd8=2m <=> tempMem8=4
cyclezipPPMdd9=1m <=> tempMem9=3
7z.exe is currently set on my code to read the value from cyclezipPPMdd
(without a number). This variable must rotate through all available pieces, split from cyclezipPPMdd0
, but is always the same name, cyclezipPPMdd
(still without a number).
if defined cyclezipPPMd (
for %%x IN (%cyclezipPPMdx%) DO for %%t IN (%cyclezipPPMdt%) DO for %%d IN (%cyclezipPPMdd%) DO for %%w IN (%cyclezipPPMdw%) DO (
set "cmd=7z.exe a teste.resultado\%%xx.ppmd.%%tt.%%dd.%%ww.zip .\teste.original\* -mx=%%x -mm=PPMd:mem=%%d:o=%%w -mmt=%%t"
call :executeProc
)
)
The first 7z.exe run would do cyclezipPPMdd=256m
, the second run would do cyclezipPPMdd=128m
etc... like this:
first run
cyclezipPPMdd1=256m <=> tempMem1=258 -> cyclezipPPMdd=256m
cyclezipPPMdd2=128m <=> tempMem2=130
cyclezipPPMdd3=64m <=> tempMem3=66
cyclezipPPMdd4=32m <=> tempMem4=34
cyclezipPPMdd5=16m <=> tempMem5=18
cyclezipPPMdd6=8m <=> tempMem6=10
cyclezipPPMdd7=4m <=> tempMem7=6
cyclezipPPMdd8=2m <=> tempMem8=4
cyclezipPPMdd9=1m <=> tempMem9=3
second run
cyclezipPPMdd1=256m <=> tempMem1=258
cyclezipPPMdd2=128m <=> tempMem2=130 -> cyclezipPPMdd=128m
cyclezipPPMdd3=64m <=> tempMem3=66
cyclezipPPMdd4=32m <=> tempMem4=34
cyclezipPPMdd5=16m <=> tempMem5=18
cyclezipPPMdd6=8m <=> tempMem6=10
cyclezipPPMdd7=4m <=> tempMem7=6
cyclezipPPMdd8=2m <=> tempMem8=4
cyclezipPPMdd9=1m <=> tempMem9=3
third run
cyclezipPPMdd1=256m <=> tempMem1=258
cyclezipPPMdd2=128m <=> tempMem2=130
cyclezipPPMdd3=64m <=> tempMem3=66 -> cyclezipPPMdd=64m
cyclezipPPMdd4=32m <=> tempMem4=34
cyclezipPPMdd5=16m <=> tempMem5=18
cyclezipPPMdd6=8m <=> tempMem6=10
cyclezipPPMdd7=4m <=> tempMem7=6
cyclezipPPMdd8=2m <=> tempMem8=4
cyclezipPPMdd9=1m <=> tempMem9=3
etc...
However, this is not everything. There is yet another 7z.exe parameter that not only also affect how much memory will be used, but also, how many threads will be used. I don't have this part ready in my script, I'm still trying to figure how to implement it.
first cycle <=> cyclezipPPMdt1=1 <=> tempProc1=8
first run
cyclezipPPMdd1=256m <=> tempMem1=258 -> cyclezipPPMdd=256m
cyclezipPPMdd2=128m <=> tempMem2=130
second run
cyclezipPPMdd1=256m <=> tempMem1=258
cyclezipPPMdd2=128m <=> tempMem2=130 -> cyclezipPPMdd=128m
etc...
second cycle <=> cyclezipPPMdt2=2 <=> tempProc2=4
first run
cyclezipPPMdd1=256m <=> tempMem1=580 -> cyclezipPPMdd=256m
cyclezipPPMdd2=128m <=> tempMem2=324
second run
cyclezipPPMdd1=256m <=> tempMem1=580
cyclezipPPMdd2=128m <=> tempMem2=324 -> cyclezipPPMdd=128m
etc...
The following table shows the relation between memory usage, thread usage and compression strength for zipPPMd algorythm.
@echo off
echo mem=1m 2m 4m 8m 16m 32m 64m 128m 256m
echo o=2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
echo mt=1 2 3 4 5 6 7 8
echo x=1 3 5 7 9
echo 256m 9x 7x 5x 3x 1x 8t - 2320 MB, 7t - 2030 MB, 6t - 1740 MB, 5t - 1450 MB, 4t - 1160 MB, 3t - 870 MB, 2t - 580 MB, 1t - 258 MB
echo 128m 9x 7x 5x 3x 1x 8t - 1296 MB, 7t - 1134 MB, 6t - 972 MB, 5t - 810 MB, 4t - 648 MB, 3t - 486 MB, 2t - 324 MB, 1t - 130 MB
echo 64m 9x 7x 5x 3x 1x 8t - 784 MB, 7t - 686 MB, 6t - 588 MB, 5t - 490 MB, 4t - 392 MB, 3t - 294 MB, 2t - 196 MB, 1t - 66 MB
echo 32m 9x 7x 5x 3x 1x 8t - 528 MB, 7t - 462 MB, 6t - 396 MB, 5t - 330 MB, 4t - 264 MB, 3t - 198 MB, 2t - 132 MB, 1t - 34 MB
echo 16m 9x 7x 5x 3x 1x 8t - 400 MB, 7t - 350 MB, 6t - 300 MB, 5t - 250 MB, 4t - 200 MB, 3t - 150 MB, 2t - 100 MB, 1t - 18 MB
echo 8m 9x 7x 5x 3x 1x 8t - 336 MB, 7t - 294 MB, 6t - 252 MB, 5t - 210 MB, 4t - 168 MB, 3t - 126 MB, 2t - 84 MB, 1t - 10 MB
echo 4m 9x 7x 5x 3x 1x 8t - 304 MB, 7t - 266 MB, 6t - 228 MB, 5t - 190 MB, 4t - 152 MB, 3t - 114 MB, 2t - 76 MB, 1t - 6 MB
echo 2m 9x 7x 5x 3x 1x 8t - 288 MB, 7t - 252 MB, 6t - 216 MB, 5t - 180 MB, 4t - 144 MB, 3t - 108 MB, 2t - 72 MB, 1t - 4 MB
echo 1m 9x 7x 5x 3x 1x 8t - 280 MB, 7t - 245 MB, 6t - 210 MB, 5t - 175 MB, 4t - 140 MB, 3t - 105 MB, 2t - 70 MB, 1t - 3 MB
No matter the compression strength (defined as x
in this table, and as %cyclezipPPMdx%
on the script), when the dictionary (mem
in table, %cyclezipPPMdd%
in script) is set to, for example, 256m, the corresponding real memory usage (tempMem#
in the script) will be dependant on how many threads (mt
in table, %cyclezipPPMdt%
in script) are defined.
The sequence set "memcyclezipPPMdd=258 130 66 34 18 10 6 4 3"
are from the last column of that table.