Register for your free account! | Forgot your password?

Go Back   elitepvpers > The Black Market > Other Trading > Coders Trading
You last visited: Today at 09:08

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



process bar in batch script

Discussion on process bar in batch script within the Coders Trading forum part of the Other Trading category.

Closed Thread
 
Old   #1

 
Eule's Avatar
 
elite*gold: 0
The Black Market: 175/0/1
Join Date: May 2014
Posts: 1,336
Received Thanks: 459
process bar in batch script

allo allo
ich hab nen script was den inhalt einer txt datei nach duplicates überprüft.. würde nun gerne eine processbar in das script coden lassen falls möglich... damit ich bei sehr sehr großen datein den fortschritt sehe

habe mir schon ein paar processbar scripts angeschaut nur leider weis ich nicht wie ich das in den code integriere

script :

@ off
setlocal disableDelayedExpansion
set "file=%~1"
set "line=%file%.line"
set "deduped=%file%.deduped"
:efine a variable containing a linefeed character
set LF=^


::The 2 blank lines above are critical, do not remove
>"%deduped%" (
for /f usebackq^ eol^=^%LF%%LF%^ delims^= %%A in ("%file%") do (
set "ln=%%A"
setlocal enableDelayedExpansion
>"%line%" (echo !ln:\=\\!)
>nul findstr /ilg:"%line%" "%deduped%" || (echo !ln!)
endlocal
)
)
>nul move /y "%deduped%" "%~n1_deduped%~x1"
2>nul del "%line%"
Eule is offline  
Old 03/08/2020, 17:46   #2 Trade Status: Unverified(?)
 
0o0o0o0o's Avatar
 
elite*gold: 26
Join Date: Oct 2012
Posts: 301
Received Thanks: 267
bau im loop nen zähler ein mit echo, dann siehst du wenigstens ob was weitergeht und wieviel schon verarbeitet wurde.

wenn du dann wissen willst, wie weit es in prozent ist, dann musst du vor dem loop die länge des files messen/anzahl der einträge, und kannst dann mit dem counter im loop den prozentsatz ausrechnen.
0o0o0o0o is offline  
Old 03/08/2020, 19:10   #3 Trade Status: Unverified(?)
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
Das ist gar nicht mal so trivial.
Du gehst zeilenweise durch, d.h. um den Anteil der bisher betrachteteten Zeilen zu berechnen musst du wissen wie viele Zeilen insgesamt da sind. Dafür musst du einmal über die Datei laufen und nix machen außer die Zeilen zählen.
Dann wenn du beim vergleichen durch die zeilen läufst kannst du einfach einen counter mitlaufen lassen, und dann den anzeil berechnen (curr / all) und dann entsprechend einen progress anzeigen.

Mal ganz davon abgesehen sollte das aber auf gar keinen fall so lange dauern das du eine Progressbar brauchen solltest.
Beispiel, dieses Python script macht genau das was dein Script macht (also removed alle dublicates von einer eingabe):
Code:
import sys

lines = set()
for ln in sys.stdin:
  ln = ln.rstrip()
  if ln not in lines:
    print(ln)
    lines.add(ln)
und braucht für den gesammten LLVM source code (150 mb, c.a. 4 mio lines) wenige sekunden.
Dein script habe ich auf dem selben Source nach c.a. 20 minuten abgebrochen.

Der Hauptgrund dafür ist ziemlich simpel, Asymptotische Laufzeit. Wie dein Script läuft meins auch Zeilenweise drüber, der Unterschied ist aber wie der inhalt verglichen wird. Ich benutze ein Python-Set, was unterliegend ein HashSet benutzt und damit eine Average-Case lookup und insertion zeit hat von 1, im worst case N (größe des Sets) aber der worst case tritt extrem selten ein. Wenn die datei also N zeilen hat ist der durchschnittliche aufwand N*1.

Dein script schreibt alle gefunden zeilen in die Ausgabe datei, und macht dann eine lineare Suche drüber. Die Asymptotische laufzeit ist also im Best Case 1 (wenn es direkt die erste zeile Matcht) im Worst case N (wenn die zeile nicht vorkommt muss jede Zeile überprüft werden). Der Average case ist nicht so klar, wenn die datei die du untersuchst nur sehr wenige dublikate hat, dann ist der Average Case N, weil für jedes nicht-dublikat (was fast alle zeilen sind) musst du alle N zeilen durchlaufen. Wenn insgesammt nur 3-4 verschiedene Werte aber vorkommen und fast alles ein dublikat ist ist es genau anders rum und der Average Case ist 1.
Solang aber die anzahl an nicht dublikaten nicht extrem viel kleiner ist als die Anzahl an Dublikaten (also größenordnungen niedriger), ist der Average Case Linear also N und damit die Gesammtlaufzeit N*N = N².

Setzen wir die Zahlen einfach mal für mein LLVM ein: Mein Script: Linear bei 4 mio zeilen = 4 mio überprüfungen
Dein script Quadratisch: 4mio*4mio = 1.6e+13 (16 mit 12 mal 0 hintendran) also 16 Billionen (Deutsche billionen, englische Trillion) überprüfungen.

Noch dazu kommt, das Python script hat alle daten im RAM, dein script schreibt zu erst die zeile die gesucht wird in eine datei, um danach die zeile in einer anderen datei zu suchen. Es werden also 3 Platten operationen (1xschreiben, 2xLesen) ausgeführt.
Hashsets haben eine beschissene Konstante laufzeit, verglichen mit anderen Datenstrukturen, ist aber bestimmt trozdem um so einen Faktor 10-100 schneller als eine Plattenoperation. D.h. Du führst nicht nur 4 millionen mal so viele Operationen aus wie mein script, jede deiner Operationen ist auch noch 10 bis 100 mal so langsam.

Eine alternative wäre die verwendung einer Sortierten Liste, z.b. über einen RBT (Red-Black-Tree), auf der man dann binärsuche machen kann. Die Worst-Case laufzeit hierbei ist Log2(n), wodurch die gesammt anzahl an vergleichen bei dem LLVM source also bei c.a. 90 mio vergleichen läg, was immernoch massenhaft besser ist als dein linearer ansatz. Das hat den vorteil gegenüber HashSets, das der Konstante overhead geringer ist als beim Pflegen einer HashTable. Damit wäre das auch eine möglichkeit.


Langer Rede kurzer Sinn: statt eine Progressbar einzubauen die dir anzeigt wie lang es dauert, bau doch einfach das Script so das es gar nicht erst so lange dauert.
Ich kann dir jetzt nicht sagen wie das in Batch geht, ich würde dir aber auch empfehlen einfach nicht Batch zu verwenden. Für alles was nicht das simple aufrufen von Programmen ist ist Batch gänzlich ungeeignet. Mein python script oben ist 1. Besser, 2. Kürzer und 3. Leserlicher als jedes Batch script mit dem du ankommen köntest. Wenn du nicht garantieren kannst/möchtest das python vorinstalliert ist, dieses C++ Programm kannst du einfach für Windows Compilen und nutzt auch ein HashSet:
Code:
#include<unordered_set>
#include<iostream>
#include<string>

int main() {
  std::unordered_set<std::string> lines;
  std::string line;
  while (std::getline(std::cin, line)) {
    if (!lines.count(line)) {
      lines.insert(line);
      std::cout << line << '\n';
    }
  }
  return 0;
}
warfley is offline  
Thanks
3 Users
Old 03/09/2020, 14:13   #4

 
Eule's Avatar
 
elite*gold: 0
The Black Market: 175/0/1
Join Date: May 2014
Posts: 1,336
Received Thanks: 459
Quote:
Originally Posted by warfley View Post
x
danke für deine ausführliche antwort und erklärung wie das ganze im batch abläuft.Da ich wirklich keine programmier Kenntnisse habe wollte ich nachfragen ob du mir gegen geld helfen kannst? Denn wie du schon erläutert hat ist das ganze im batch sehr sehr sehr langsam und ich brauche abhilfe
Eule is offline  
Old 03/11/2020, 18:16   #5 Trade Status: Unverified(?)


 
False's Avatar
 
elite*gold: 0
The Black Market: 243/0/0
Join Date: Apr 2011
Posts: 11,117
Received Thanks: 2,436
Arrow General Coding -> Coders Trading

#moved
False is offline  
Closed Thread


Similar Threads Similar Threads
Best time to activate premium ? Grey bar , yellow bar or red bar ?
06/14/2013 - Silkroad Online - 1 Replies
Im playing silkroad r . Im currectly level 86. What would be the best time to activate a premium plus ? During the yellow , red or grey bar ?
Process Bar [Easy]
01/07/2011 - AutoIt - 6 Replies
Hi @ all , Ich bins mal wieder . Eure Loli ! Heute möchte ich euch einmal den Process Bar Zeigen Dafür habe ich auchschon einen Script vorbereitet ! Der sieht so aus : #include <ButtonConstants.au3>
Mit Process Explorer /Process Hacker Hs umgehen
05/22/2010 - General Gaming Discussion - 1 Replies
Ich habe hier im Forum gelesen, das man mit Process Explorer bzw. Process Hacker das HS umgehen kann. Leider ist mir irgendwie schleierhaft wie das gehen soll. Vllt erbarmt sich jemand und erklärt es (:, da man den sogenannten Bypasser nur noch las Premium Dings Da bei Upload.to runterladen kann :rolleyes:
Trade SF account double bar to double bar
11/05/2009 - Soldier Front Philippines - 5 Replies
Add me to ym [email protected] The Guns are: Engraving PSG Gold-Ak KD: 1.2+ Acc:3% SP:11000
C# how to pause a process/freeze process
12/08/2008 - CO2 Programming - 2 Replies
ya so i was semi bored and after little bit of looking around i didnt find to many examples of how to do this so attached is a demo project to show you how. basically it comes down to calling ResumeThread() and SuspendThread() (API functions) on all the threads of a process...simple enough http://img388.imageshack.us/img388/9762/exampleil 6.png please note when you enter the process name there's no ".exe" to the end Warning: this isn't idiot proof . .



All times are GMT +1. The time now is 09:08.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.