2023-09-09, 10:31
  #169
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Mysadname
Nä, har kollat så det inte finns någon uppdatering som väntar, startat om datorn och inget annat igång men den står still på samma rad.

Mycket märkligt
Konstigt, så här ser output ut på min MacBook som bara har 8GB RAM (jag lade till en tidsmätning också och ändrade varje block till 1 miiljoner rader istället för 100 000):
Kod:
Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff 3
Önskad summa (t.ex. 200.0) ? 200
Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? 0.01
Tryck 1 för text-fil och 2 för CSV-fil: 1
Fullträff omgång 50:
Length of chunks: 13061
1 million iterations, 121 rows found
2 million iterations, 248 rows found
3 million iterations, 532 rows found
4 million iterations, 788 rows found
5 million iterations, 1195 rows found
6 million iterations, 1508 rows found
7 million iterations, 1711 rows found
8 million iterations, 1972 rows found
9 million iterations, 2080 rows found
10 million iterations, 2268 rows found
11 million iterations, 2512 rows found
12 million iterations, 2811 rows found
13 million iterations, 3265 rows found
14 million iterations, 3705 rows found
15 million iterations, 4111 rows found
16 million iterations, 4484 rows found
17 million iterations, 4849 rows found
18 million iterations, 5192 rows found
19 million iterations, 5447 rows found
20 million iterations, 5791 rows found
21 million iterations, 6120 rows found
22 million iterations, 6507 rows found
23 million iterations, 6945 rows found
24 million iterations, 7425 rows found
25 million iterations, 7800 rows found
26 million iterations, 8239 rows found
27 million iterations, 8585 rows found
28 million iterations, 9043 rows found
29 million iterations, 9371 rows found
30 million iterations, 9728 rows found
31 million iterations, 10014 rows found
Time taken: 17.73 seconds
Avg. time: 0.5719 sec/million iterations
tips.txt skapad med 10000 rader!
Uppdaterade koden (endast tidsmätning tillagd):
__________________
Senast redigerad av Enterprise 2023-09-09 kl. 10:35.
Citera
2023-09-09, 10:33
  #170
Medlem
Citat:
Ursprungligen postat av Enterprise
Konstigt, så här ser output ut på min MacBook som bara har 8GB RAM (jag lade till en tidsmätning också):
Kod:
Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff 3
Önskad summa (t.ex. 200.0) ? 200
Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? 0.01
Tryck 1 för text-fil och 2 för CSV-fil: 1
Fullträff omgång 50:
Length of chunks: 13061
1 million iterations, 121 rows found
2 million iterations, 248 rows found
3 million iterations, 532 rows found
4 million iterations, 788 rows found
5 million iterations, 1195 rows found
6 million iterations, 1508 rows found
7 million iterations, 1711 rows found
8 million iterations, 1972 rows found
9 million iterations, 2080 rows found
10 million iterations, 2268 rows found
11 million iterations, 2512 rows found
12 million iterations, 2811 rows found
13 million iterations, 3265 rows found
14 million iterations, 3705 rows found
15 million iterations, 4111 rows found
16 million iterations, 4484 rows found
17 million iterations, 4849 rows found
18 million iterations, 5192 rows found
19 million iterations, 5447 rows found
20 million iterations, 5791 rows found
21 million iterations, 6120 rows found
22 million iterations, 6507 rows found
23 million iterations, 6945 rows found
24 million iterations, 7425 rows found
25 million iterations, 7800 rows found
26 million iterations, 8239 rows found
27 million iterations, 8585 rows found
28 million iterations, 9043 rows found
29 million iterations, 9371 rows found
30 million iterations, 9728 rows found
31 million iterations, 10014 rows found
Time taken: 17.73 seconds
Avg. time: 0.5719 sec/million iterations
tips.txt skapad med 10000 rader!
Uppdaterade koden (endast tidsmätning tillagd):

När jag testar ovan uppdaterade så får jag felmeddelande:

Cell In[6], line 11
sub_gen = itertools.islice(itertools.product(*[enumerate(row) for row in rowlist]), start, end)
^
IndentationError: expected an indented block after function definition on line 10
Citera
2023-09-09, 10:36
  #171
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Mysadname
När jag testar ovan uppdaterade så får jag felmeddelande:

Cell In[6], line 11
sub_gen = itertools.islice(itertools.product(*[enumerate(row) for row in rowlist]), start, end)
^
IndentationError: expected an indented block after function definition on line 10
Sorry, hade glömt kod-taggen, men lagt till nu
Uppdatera sidan och hämta koden igen.
Citera
2023-09-09, 10:52
  #172
Medlem
Citat:
Ursprungligen postat av Enterprise
Sorry, hade glömt kod-taggen, men lagt till nu
Uppdatera sidan och hämta koden igen.

Lite annan stavning på sista raden nu när jag kör men kommer inte ut något efter denna:

Length of chunks: 13061
Citera
2023-09-09, 10:57
  #173
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Mysadname
Lite annan stavning på sista raden nu när jag kör men kommer inte ut något efter denna:

Length of chunks: 13061
Men vad händer sen?
Fryser programmet på obestämd tid eller avbryts det?
Citera
2023-09-09, 11:02
  #174
Medlem
Citat:
Ursprungligen postat av Enterprise
Men vad händer sen?
Fryser programmet på obestämd tid eller avbryts det?

Fryser på obestämd tid, jag kan inte skriva något igen, därför tror man ju att det körs, men det kommer inte ut något mer efter den raden, det avbröts / kraschade / stängde ner bara första körningen men nu verkar det alltså frysa
Citera
2023-09-09, 11:10
  #175
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Mysadname
Fryser på obestämd tid, jag kan inte skriva något igen, därför tror man ju att det körs, men det kommer inte ut något mer efter den raden, det avbröts / kraschade / stängde ner bara första körningen men nu verkar det alltså frysa
Vad får du ut om du kör följande uppdaterade variant?
Kod:
import requests
import re
import json
import itertools
import os
import time

from concurrent.futures import ProcessPoolExecutor

def process_chunk(start, end, rowlist, pmin, pmax):
	sub_gen = itertools.islice(itertools.product(*[enumerate(row) for row in rowlist]), start, end)
	valid_combinations = []
	tss = 0
	for comb in sub_gen:
		tss += 1
		indices, values = zip(*comb)
		s = sum(values)
		if pmin <= s <= pmax:
			valid_combinations.append(indices + (s,))
	return valid_combinations, tss

def main():
	
	max_num_of_workers = 4 # ändras för att ändra antalet parallella processer
	
	gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))

	if not gamemode in [1,2,3]:	
		print("Endast 1-2 möjliga val. Avbryter.")
		quit()

	pgoal = float(input("Önskad summa (t.ex. 200.0) ? "))
	pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
	pmin = pgoal - pdev
	pmax = pgoal + pdev

	mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))

	if not mde in [1,2]:
		print("Endast 1 eller 2 möjliga val. Avbryter.")
		quit()

	urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset", "https://spela.svenskaspel.se/fulltraff"]
	url = urls[gamemode]

	outfiles = ["", "tips.txt", "tips.csv"]
	outfile = outfiles[mde]

	try: 
		response = requests.get(url)
		html_content = response.text

	except:
		print(f"Kan inte komma hämta data från: {url}. Avbryter.")
		quit()

	pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'

	try:
		match = re.search(pattern, html_content)
		json_str = match.group(1)
		json_obj = json.loads(json_str)
		gameDict = json_obj["EventTypeStatistic"]
		gameKeys = list(dict.keys(gameDict))

	except:
		print(f"Kunde inte extrahera data")
		quit()

	signlists = []
	rowlist = []

	if gamemode == 3:  # om fullträff, sätt upp lista utifrån 13 rader
		draws=json_obj["Draws"]["entities"]
	
		try:
			drawsKey = list(dict.keys(draws))[0]
		except IndexError:
			print("Inte möjligt att hämta Fullträff-omgång. Avbryter.")
			quit()
	
		omg=draws[drawsKey]["drawNumber"] # hämta omgångsnr
		print(f"Fullträff omgång {omg}:")	
	
	else:   # annars sätt upp lista utifrån 3 tecken
		for _ in range(0,3):
			signlists.append([])

	for gameKey in gameKeys: # iterera över alla 13 matcher
	
		numAlts=3
		if gamemode==3:  # Fullträff
			numAlts=6
	
		game = gameDict[gameKey]["odds"]["current"]["value"]  # hämtar odds-värden från Fullträff-sidan
		gamesum = 0.0
		
		floats = []
		fgame = []
		
		for i in range(0,numAlts):
			if game[i] == None:
				print ("None-error",gameDict[gameKey])
				quit()
			f = 100.0/float(game[i]) # konvertera oddset 100/o
			floats.append(f)
		
		gamesum = sum(floats)
	
		for ix,o in enumerate(floats):
			newo = 100.0 * o / gamesum  # normalfördela fullträff-oddsen så att summan blir 100.0
			if ix<numAlts:
				fgame.append(newo)

		if gamemode==3:
			rowlist.append(fgame)
		
		else:
			for ix,perc in enumerate(fgame):
				signlists[ix].append(perc)

	if gamemode<3:
	
		P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] } 
		rows = itertools.product(*(['1X2'] * 13))

		cn = 0

		with open(outfile, 'w') as f:  
			for row in rows:
				percentage = sum(P[result][n] for (n, result) in enumerate(row))
		
				if  pmin <= percentage <= pmax:
					cn += 1
					if mde==1:
						f.write("E,"+','.join(row)+"\n")
					if mde==2:
						f.write(','.join(row + (str(percentage),))+"\n")
	else:
		maxcoupons = 10000
		cn = 0
		tsts = 0
		valid_combinations = []
		
		default_workers = os.cpu_count()
		print(f"Default number of workers: {default_workers}")

		chunk_size = 1000000  # You can adjust the chunk size
		total_size = 6 ** 13  # 6^13 combinations
		chunks = [(i, min(i + chunk_size, total_size)) for i in range(0, total_size, chunk_size)]
	
		print ("Length of chunks:",len(chunks))
		
		start_time = time.time()
	
		with ProcessPoolExecutor(max_workers=max_num_of_workers) as executor:
			print(f"Executor is using {executor._max_workers} workers")
			
			for chunk_result, chunk_tsts in executor.map(process_chunk, [start for start, end in chunks], [end for start, end in chunks], itertools.repeat(rowlist), itertools.repeat(pmin), itertools.repeat(pmax)):
   
				tsts += chunk_tsts
				valid_combinations.extend(chunk_result)
				cn += len(chunk_result)

				if tsts % 1000000 == 0:
					print(int(tsts / 1000000), "million iterations,", cn, "rows found")

				if cn >= maxcoupons:
					break
	
		end_time = time.time()
		taken_time = round(end_time - start_time,2)
		ave_time = round(taken_time/(tsts/1000000),4)
		print(f"Time taken: {taken_time} seconds")
		print(f"Avg. time: {ave_time} sec/million iterations")
		
		
		with open(outfile, 'w') as f:
		
			f.write(f"Fulltraff,Omg={omg}\n") # första raden 
		
			for ix,comb in enumerate(valid_combinations):
			
				if mde == 1 and ix<maxcoupons: # TXT-läge
					comb=list(comb)
					comb.pop() # ta bort summa som inte används i TXT-läge
					f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
				
				elif mde == 2 and ix<maxcoupons: # CSV-läge
					f.write(','.join(str(nm) for nm in comb)+"\n")

	cn=min(cn,maxcoupons)
	
	print(f"{outfile} skapad med {cn} rader!")

if __name__ == '__main__':
    main()
Citera
2023-09-09, 11:12
  #176
Medlem
Enterprises avatar
Stäng ned alla program och starta om datorn innan du kör det igen.
Om du kör massor av terminaler i bakgrunden så blir det för mycket.
Citera
2023-09-09, 11:13
  #177
Medlem
Citat:
Ursprungligen postat av Enterprise
Vad får du ut om du kör följande uppdaterade variant?
Kod:
import requests
import re
import json
import itertools
import os
import time

from concurrent.futures import ProcessPoolExecutor

def process_chunk(start, end, rowlist, pmin, pmax):
	sub_gen = itertools.islice(itertools.product(*[enumerate(row) for row in rowlist]), start, end)
	valid_combinations = []
	tss = 0
	for comb in sub_gen:
		tss += 1
		indices, values = zip(*comb)
		s = sum(values)
		if pmin <= s <= pmax:
			valid_combinations.append(indices + (s,))
	return valid_combinations, tss

def main():
	
	max_num_of_workers = 4 # ändras för att ändra antalet parallella processer
	
	gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))

	if not gamemode in [1,2,3]:	
		print("Endast 1-2 möjliga val. Avbryter.")
		quit()

	pgoal = float(input("Önskad summa (t.ex. 200.0) ? "))
	pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
	pmin = pgoal - pdev
	pmax = pgoal + pdev

	mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))

	if not mde in [1,2]:
		print("Endast 1 eller 2 möjliga val. Avbryter.")
		quit()

	urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset", "https://spela.svenskaspel.se/fulltraff"]
	url = urls[gamemode]

	outfiles = ["", "tips.txt", "tips.csv"]
	outfile = outfiles[mde]

	try: 
		response = requests.get(url)
		html_content = response.text

	except:
		print(f"Kan inte komma hämta data från: {url}. Avbryter.")
		quit()

	pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'

	try:
		match = re.search(pattern, html_content)
		json_str = match.group(1)
		json_obj = json.loads(json_str)
		gameDict = json_obj["EventTypeStatistic"]
		gameKeys = list(dict.keys(gameDict))

	except:
		print(f"Kunde inte extrahera data")
		quit()

	signlists = []
	rowlist = []

	if gamemode == 3:  # om fullträff, sätt upp lista utifrån 13 rader
		draws=json_obj["Draws"]["entities"]
	
		try:
			drawsKey = list(dict.keys(draws))[0]
		except IndexError:
			print("Inte möjligt att hämta Fullträff-omgång. Avbryter.")
			quit()
	
		omg=draws[drawsKey]["drawNumber"] # hämta omgångsnr
		print(f"Fullträff omgång {omg}:")	
	
	else:   # annars sätt upp lista utifrån 3 tecken
		for _ in range(0,3):
			signlists.append([])

	for gameKey in gameKeys: # iterera över alla 13 matcher
	
		numAlts=3
		if gamemode==3:  # Fullträff
			numAlts=6
	
		game = gameDict[gameKey]["odds"]["current"]["value"]  # hämtar odds-värden från Fullträff-sidan
		gamesum = 0.0
		
		floats = []
		fgame = []
		
		for i in range(0,numAlts):
			if game[i] == None:
				print ("None-error",gameDict[gameKey])
				quit()
			f = 100.0/float(game[i]) # konvertera oddset 100/o
			floats.append(f)
		
		gamesum = sum(floats)
	
		for ix,o in enumerate(floats):
			newo = 100.0 * o / gamesum  # normalfördela fullträff-oddsen så att summan blir 100.0
			if ix<numAlts:
				fgame.append(newo)

		if gamemode==3:
			rowlist.append(fgame)
		
		else:
			for ix,perc in enumerate(fgame):
				signlists[ix].append(perc)

	if gamemode<3:
	
		P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] } 
		rows = itertools.product(*(['1X2'] * 13))

		cn = 0

		with open(outfile, 'w') as f:  
			for row in rows:
				percentage = sum(P[result][n] for (n, result) in enumerate(row))
		
				if  pmin <= percentage <= pmax:
					cn += 1
					if mde==1:
						f.write("E,"+','.join(row)+"\n")
					if mde==2:
						f.write(','.join(row + (str(percentage),))+"\n")
	else:
		maxcoupons = 10000
		cn = 0
		tsts = 0
		valid_combinations = []
		
		default_workers = os.cpu_count()
		print(f"Default number of workers: {default_workers}")

		chunk_size = 1000000  # You can adjust the chunk size
		total_size = 6 ** 13  # 6^13 combinations
		chunks = [(i, min(i + chunk_size, total_size)) for i in range(0, total_size, chunk_size)]
	
		print ("Length of chunks:",len(chunks))
		
		start_time = time.time()
	
		with ProcessPoolExecutor(max_workers=max_num_of_workers) as executor:
			print(f"Executor is using {executor._max_workers} workers")
			
			for chunk_result, chunk_tsts in executor.map(process_chunk, [start for start, end in chunks], [end for start, end in chunks], itertools.repeat(rowlist), itertools.repeat(pmin), itertools.repeat(pmax)):
   
				tsts += chunk_tsts
				valid_combinations.extend(chunk_result)
				cn += len(chunk_result)

				if tsts % 1000000 == 0:
					print(int(tsts / 1000000), "million iterations,", cn, "rows found")

				if cn >= maxcoupons:
					break
	
		end_time = time.time()
		taken_time = round(end_time - start_time,2)
		ave_time = round(taken_time/(tsts/1000000),4)
		print(f"Time taken: {taken_time} seconds")
		print(f"Avg. time: {ave_time} sec/million iterations")
		
		
		with open(outfile, 'w') as f:
		
			f.write(f"Fulltraff,Omg={omg}\n") # första raden 
		
			for ix,comb in enumerate(valid_combinations):
			
				if mde == 1 and ix<maxcoupons: # TXT-läge
					comb=list(comb)
					comb.pop() # ta bort summa som inte används i TXT-läge
					f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
				
				elif mde == 2 and ix<maxcoupons: # CSV-läge
					f.write(','.join(str(nm) for nm in comb)+"\n")

	cn=min(cn,maxcoupons)
	
	print(f"{outfile} skapad med {cn} rader!")

if __name__ == '__main__':
    main()

Length of chunks: 13061
Executor is using 4 workers
Traceback (most recent call last):

Cell In[1], line 197
main()

Cell In[1], line 159 in main
for chunk_result, chunk_tsts in executor.map(process_chunk, [start for start, end in chunks], [end for start, end in chunks], itertools.repeat(rowlist), itertools.repeat(pmin), itertools.repeat(pmax)):

File ~\anaconda3\Lib\concurrent\futures\process.py:816 in map
results = super().map(partial(_process_chunk, fn),

File ~\anaconda3\Lib\concurrent\futures\_base.py:608 in map
fs = [self.submit(fn, *args) for args in zip(*iterables)]

File ~\anaconda3\Lib\concurrent\futures\_base.py:608 in <listcomp>
fs = [self.submit(fn, *args) for args in zip(*iterables)]

File ~\anaconda3\Lib\concurrent\futures\process.py:770 in submit
raise BrokenProcessPool(self._broken)

BrokenProcessPool: A child process terminated abruptly, the process pool is not usable anymore
Citera
2023-09-09, 11:18
  #178
Medlem
Citat:
Ursprungligen postat av Enterprise
Stäng ned alla program och starta om datorn innan du kör det igen.
Om du kör massor av terminaler i bakgrunden så blir det för mycket.

Samma som jag skrev innan även vid omstart, vad är en child process ?
Citera
2023-09-09, 11:19
  #179
Moderator
vhes avatar
Använd kodtaggar även vid postande av felutskrifter. Indenteringen är viktig där också.

/Moderator
Citera
2023-09-09, 11:36
  #180
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Mysadname
Samma som jag skrev innan även vid omstart, vad är en child process ?
Det är en underprocess som skapas för att kunna iterera fler rader parallellt.

Hmm, vad får du för output om du i Spyder kör följande skript:
Kod:
import sys

print("Python version")
print(sys.version)
print("Version info.")
print(sys.version_info)
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in