gpt4 book ai didi

Python线程 - 内部缓冲区错误 - 内存不足

转载 作者:太空宇宙 更新时间:2023-11-04 03:37:53 29 4
gpt4 key购买 nike

我制作了一个简单的网络爬虫,使用 urllib 和 beautifulsoup 从网页上的表格中提取数据。为了加快数据拉取速度,我尝试使用线程,但出现以下错误:“内部缓冲区错误:内存分配失败:增加缓冲区”此消息出现了很多次,然后指出:“内存不足”

感谢您的帮助。

from bs4 import BeautifulSoup
from datetime import datetime
import urllib2
import re
from threading import Thread

stockData = []

#Access the list of stocks to search for data
symbolfile = open("stocks.txt")
symbolslist = symbolfile.read()
newsymbolslist = symbolslist.split("\n")

#text file stock data is stored in
myfile = open("webcrawldata.txt","a")

#initializing data for extraction of web data
lineOfData = ""
i=0

def th(ur):
stockData = []
lineOfData = ""
dataline = ""
stats = ""
page = ""
soup = ""
i=0
#creates a timestamp for when program was won
timestamp = datetime.now()
#Get Data ONLINE
#bloomberg stock quotes
url= "http://www.bloomberg.com/quote/" + ur + ":US"
page = urllib2.urlopen(url)
soup = BeautifulSoup(page.read())
#Extract key stats table only
stats = soup.find("table", {"class": "key_stat_data" })
#iteration for <tr>
j = 0
try:
for row in stats.findAll('tr'):
stockData.append(row.find('td'))
j += 1
except AttributeError:
print "Table handling error in HTML"
k=0
for cell in stockData:
#clean up text
dataline = stockData[k]
lineOfData = lineOfData + " " + str(dataline)
k += 1
g = str(timestamp) + " " + str(ur)+ ' ' + str(lineOfData) + ' ' + ("\n\n\n")
myfile.write(g)
print (ur + "\n")
del stockData[:]
lineOfData = ""
dataline = ""
stats = None
page = None
soup = None
i += 1

threadlist = []

for u in newsymbolslist:
t = Thread(target = th, args = (u,))
t.start()
threadlist.append(t)

for b in threadlist:
b.join()enter code here

最佳答案

您启动的每个线程都有一个线程堆栈大小,即 8 kb by默认在 Linux 系统中(参见 ulimit -s),因此您的线程所需的内存总数将超过 20 GB。

您可以使用线程池,例如 10 个线程;当一个完成了它的工作,它有另一项任务要做。

但是:一般来说,运行比 CPU 核心更多的线程是无稽之谈。所以我的建议是停止使用线程。您可以使用像 gevent 这样的库到在不使用操作系统级线程的情况下做完全相同的事情。

gevent 的好处是猴子修补:你可以告诉 gevent改变 Python 标准库的行为,这将改变你的线程透明地进入“greenlet”对象(参见 gevent 文档更多细节)。 gevent提出的并发类型是特别适合您正在执行的密集型 I/O。

在您的代码中,只需在开头添加以下内容:

from gevent import monkey; monkey.patch_all()

您不能同时打开超过 1024 个文件描述符Linux 系统默认(参见 ulimit -n)所以你必须增加如果您希望同时打开 2700 个文件描述符,则此限制。

关于Python线程 - 内部缓冲区错误 - 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27984317/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com