我有一个非常大的表,有250,000多行,其中许多列包含一个大的文本块。现在它是2.7GB,预计将增长至少十倍。我需要对表的每一行执行Python特定的操作,但每次只需要访问一行。
现在我的代码看起来像这样:
c.execute('SELECT * FROM big_table')
table = c.fetchall()
for row in table:
do_stuff_with_row
字符串
当表较小时,这工作得很好,但是现在表大于我可用的ram,当我尝试运行它时,python挂起。有没有更好的(更有效的ram)方法在整个表中逐行搜索?
2条答案
按热度按时间3bygqnnd1#
cursor.fetchall()
首先将所有结果提取到列表中。相反,您可以在光标 * 本身 * 上单击鼠标:
字符串
这会根据需要生成行,而不是先将它们全部加载。
ahy6op9u2#
为了提供一个测试what was mentioned by Martijn的最小可运行示例,创建一个具有10m个点的数据库:
字符串
使用此程序循环访问数据库:
main.py
型
使用Peak memory usage of a linux/unix process获得最大内存使用量
型
给出:
型
所以大约900 MB,哇。我们天真地期望每个int有8个字节,最多80 MB。然后如果我们这样做:
型
它只有11 MB:
型
在Python 3.11.4,Ubuntu 23.04上测试。