逐行在python中创建大型数据集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逐行在python中创建大型数据集相关的知识,希望对你有一定的参考价值。

对于我的毕业论文,我需要创建一个扑克动作数据集来测试模型。我写了一个函数,用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("




")
    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限制,所以我猜它只是代码不好

有人可以帮我弄清楚该怎么办?

答案

如qazxsw poi中所述,不要附加到循环内的数据帧,因为它效率非常低。而是做这样的事情:

here
另一答案

有人纠正我,如果我错了,但我相信追加数据框涉及遍历整个数据帧。这就是为什么数据帧变长需要更长的时间。我相信附加到文件不会涉及每次读取整个文件。试试这个:

files = GetFiles('hand_texts')

database = []
for hand_text in files:
    # as a sidenote, with contexts are helpful for these:
    with open('hand_texts/' + hand_text) as text:
        b=text.read()

    hands=b.split("




")

    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.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.append(EmptyLine(hand_text,i))

pd.DataFrame(database).to_csv('database2.csv'))

这也将自动关闭缩进块末尾的文件。

此外,听起来您认为使用更多RAM会自动使您的程序更快。这不是真的。通常情况下,您可以通过更快的运行时间和更多的RAM使用来进行权衡,但同一台机器上的相同代码块总是需要几乎完全相同的时间和RAM运行。

以上是关于逐行在python中创建大型数据集的主要内容,如果未能解决你的问题,请参考以下文章

使用大型数据集在 R 中创建二进制矩阵

postgres:从命令行在数据库中创建表

如何逐行读取大型文本文件,而不将其加载到内存中?

在 FROM 子句中创建大型虚拟表

python 从Scratch在Pandas中创建数据集

在带有分组约束的 sklearn (python 2.7) 中创建训练、测试和交叉验证数据集?