我有一个网络抓取应用程序,它收集数据并将其存储在数据库中。它通常运行正常,但每天有几次像这样的间歇性错误:
OperationalError: (OperationalError) server closed the connection unexpectedly
This probably means the server terminated abnormally before or while processing the
request. could not send startup packet: Broken pipe
我认为这是因为下面一批代码(发生错误的地方)处理大量数据,我不知道如何优化它。
编辑:我认为这是原因,并在下面包含了其他信息。如果出现此错误的其他原因,我很乐意知道如何修复它:)
由于它是一个网络刮刀,它会定期轮询网页以获取数据。每次轮询时,它都会收集2000到3000条记录。这些记录中有50到100个是新记录,但其余记录的某些属性可能有新信息。
另外值得注意的是:我使用Web抓取数据中的ID作为数据库中的主键,因此程序在创建对象时已经知道ID,即使它尚未在数据库中。
这是带有一些附加评论的代码:
#objs is a list of Models of all the information it just scraped. This
#finds the oldest timestamp in this set so I can reduce the database query.
#I don't know how many this tends to be.
earliest_scraped = min(o.timestamp for o in objs)
#create the sqlalchemy db session
session = db_setup()
#this queries the objects already in the database, reduced by the timestamp
#above so it is only objects which might overlap with what was scraped
existing = session.query(
Model
).filter(
Model.timestamp > earliest_scraped
)
#this merges the list of objects with the query so it updates any existing
#items and adds any new items
existing.merge_result(objs)
#commit and close
session.commit()
session.close()
答案 0 :(得分:0)
经过大量的修改后,由于系统内存不足,这次崩溃似乎一直在发生。
这是因为应用程序中的内存泄漏与上面的代码无关。