对于我的毕业论文,我需要创建一个扑克动作数据集来测试模型。我编写了一个函数,用information about the hand读取文本文件并返回list
,我将其附加到pandas数据框。
我有大约1500个文件,每个文件包含需要传递给此函数的1500~3000只手,所以我的主脚本看起来像这样。
import os
os.chdir("C:/Users/jctda/OneDrive/Documentos/TCC/Programa")
import pandas as pd
from datagen import DataGenerator, EmptyLine
from poker.room.pokerstars import PokerStarsHandHistory
from functions import FindFold, GetFiles, GetShowers
#IMPORT DATAGEN AQUI
database = pd.DataFrame()
files = GetFiles('hand_texts')
for hand_text in files:
text=open('hand_texts/' + hand_text)
b=text.read()
hands=b.split("\n\n\n\n\n")
text.close()
for i in range(1,len(hands)):
try:
hh = PokerStarsHandHistory(unicode(hands[i]))
hh.parse()
fold = FindFold(hh)
if fold == 'showdown':
for shower in GetShowers(hh):
database = database.append(DataGenerator(hh,shower,hand_text,i))
print('Success in parsing iteration ' + str(i) + ' from file' + hand_text)
except:
print('PARSER ERROR ON ITERATION [[' + str(i) + ']] FROM FILE [[' + hand_text + ']]')
database = database.append(EmptyLine(hand_text,i))
database.to_csv('database2.csv')
问题是运行几个小时后变得非常慢。第一个文件大约需要20秒,但每次运行速度都会变慢,运行8小时后每个文件开始花费超过一个小时。我刚刚开始为这个项目学习python,所以我可能在某个地方犯了一个大错误,导致它花费的时间超过了所需的时间,但我找不到它。
另一件令我烦恼的事情是,它在16GB的机器上运行时消耗的内存不到1GB。我想过试图强迫它使用更多memmory但显然python上没有memmory限制,所以我猜这只是错误的代码
有人可以帮我弄清楚该做什么吗?
答案 0 :(得分:3)
如here中所述,不要追加循环内的数据帧,因为它非常无效。而是做这样的事情:
int x = sender()->property("MyIndex").toInt();
答案 1 :(得分:2)
如果我错了,有人会纠正我,但我相信追加数据框会涉及遍历整个数据帧。这就是为什么数据帧变长需要更长的时间。我相信附加到文件不会涉及每次读取整个文件。试试这个:
with open('database2.csv', 'wa') as file: # 'wa' is write append mode
file.write(relevant_data)
这也会自动关闭缩进块末尾的文件。
此外,听起来您认为使用更多RAM会自动使您的程序更快。这不是真的。通常情况下,您可以通过更快的运行时间和更多的RAM使用来进行权衡,但同一台机器上的相同代码块总是需要几乎完全相同的时间和RAM运行。