Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从SQL数据库中获取数据后内存问题_Python_Pandas_Dataframe - Fatal编程技术网

Python 从SQL数据库中获取数据后内存问题

Python 从SQL数据库中获取数据后内存问题,python,pandas,dataframe,Python,Pandas,Dataframe,我的目标是将一个庞大的数据集从我们的SQL数据库中提取到一个数据库中。首先,我通过计算机读取数据 dataSQL=pd.read\u sql\u queryquery,con,chunksize=1000 由于数据量巨大,为了避免内存问题,我使用了1000个chunksize。然后,我想将dataSQL generator对象的结果附加到一个文件中,因此: chunkyData= pd.DataFrame() #create an empty df for chunk in dataSQL:

我的目标是将一个庞大的数据集从我们的SQL数据库中提取到一个数据库中。首先,我通过计算机读取数据

dataSQL=pd.read\u sql\u queryquery,con,chunksize=1000

由于数据量巨大,为了避免内存问题,我使用了1000个chunksize。然后,我想将dataSQL generator对象的结果附加到一个文件中,因此:

chunkyData= pd.DataFrame() #create an empty df

for chunk in dataSQL:
  chunkyData = chunkyData.append(chunk, ignore_index = True) # append chunks to the empty df
但这是我再次遇到内存问题的地方,错误是:

回溯最近一次调用:文件,第3行,在 文件C:\程序文件 x86\Python\lib\site packages\pandas\core\reforme\concat.py,第行 225,康卡特 copy=copy,sort=sort File C:\Program Files x86\Python\lib\site packages\pandas\core\Reformate\concat.py,第行 289,在init中 obj.\u consolidateinplace=True文件C:\Program Files x86\Python\lib\site packages\pandas\core\generic.py,第4457行,在 _巩固 self.\u consolidation\u in place文件C:\Program Files x86\Python\lib\site packages\pandas\core\generic.py,第4439行,在 _巩固 self.\u protect\u consolidatef文件C:\Program Files x86\Python\lib\site packages\pandas\core\generic.py,第4428行,在 _保固 结果=f文件C:\ProgramFilesx86\Python\lib\site packages\pandas\core\generic.py,第4437行,在 F self.\u data=self.\u data.consolidate文件C:\Program Files x86\Python\lib\site packages\pandas\core\internals.py,第4098行, 合并中 bm.\u合并\u替换文件C:\Program Files x86\Python\lib\site packages\pandas\core\internals.py,第4103行, 合并到位 self.blocks=tuple\u consolidateself.blocks文件C:\Program Files x86\Python\lib\site packages\pandas\core\internals.py,第行 5069,在 _can\u consolidate=\u can\u consolidate文件C:\Program Files x86\Python\lib\site packages\pandas\core\internals.py,第5089行, 合并块中的 new_values=_vstack[b.块中b的值],数据类型文件C:\Program Files x86\Python\lib\site packages\pandas\core\internals.py,第5135行, in_vstack 返回np.vstackto_堆栈文件C:\Program Files x86\Python\lib\site packages\numpy\core\shape\u base.py,第234行 vstack 返回_nx.concatenate[tup中的_m的至少_2d_m],0 MemoryError


我被记忆问题缠住了。虽然generator对象有助于获取数据,但由于内存问题,现在我无法将此数据添加到数据帧。

这可能无法直接回答您的问题,但您是否需要立即将所有数据读取到内存中?您对这些数据的最终目标是什么?以下是我提出这个问题的几个原因

向用户显示数据: 如果您只是拉取数据来表示数据,那么可以使用分页,大多数SQL风格都可以在LIMIT子句中轻松处理分页。如果每页显示100个结果,并且用户选择第10页,则只需计算10-1*100=900,然后使用“LIMIT 900100”再次运行查询

非骨料加工: 如果要独立于其余数据处理每条记录,只需使用生成器迭代、处理每一行,并通过插入另一个SQL表将输出存储到其他位置即可。结果应该是一组小得多的数据,您可以查询这些数据,并在需要时轻松地将其存储在内存中

骨料加工: 如果需要在整个数据中运行聚合函数,可以在SQL查询中执行此操作。任何现代SQL数据库都可以通过优化查询轻松完成相当复杂的处理。如果由于需要使用某些特定的Python库而不能将负担放在SQL db上,那么可能需要找到一个有效的map reduce解决方案。如果您可以访问spark群集,这将是一个理想的用例

编辑:

另一种选择是使用随机梯度下降回归器或分类器。然后,您可以进行部分拟合,允许模型一次优化一个样本的系数。这将允许您使用生成器一次读取csv中的一行内容,当然,这取决于csv的大小,可能需要一段时间才能读取,就像您对熊猫所做的那样

下面是一些示例代码,假设csv文件中的每一行都有一个所有int的示例,并且该行中的最后一个int是您的目标

from sklearn.linear_model import SGDClassifier
import csv
import numpy as np

clf2 = SGDClassifier(loss='log')
filename = 'yourfile.csv'

with open(filename, "rt") as f:
    reader = csv.reader(f)
    for row in reader:
        sample = np.array(row, dtype=np.int)
        clf2.partial_fit(sample[:-1], sample[-1])

我需要在此数据非聚合处理上开发一个模型,但我可以将数据存储在2/3 CSV中,然后在上执行建模that@Kay看看我刚刚做的编辑,也许使用SGD和许多部分适合你。