我们有一个写入规模比较大到谷歌云存储的许多文件App Engine应用程序。 这些文件是动态创建的CSV的,所以我们使用Python的StringIO.StringIO
作为缓冲区,并将csv.writer
作为编写该缓冲区的接口。
在一般情况下,我们的流程是这样的:
# imports as needed
# (gcs is the Google Cloud Store client)
buffer = StringIO.StringIO()
writer = csv.writer(buffer)
# ...
# write some rows
# ...
data = file_buffer.getdata()
filename = 'someFilename.csv'
try:
with gcs.open(filename, content_type='text/csv', mode='w') as file_stream:
file_stream.write(data)
file_stream.close()
except Exception, e:
# handle exception
finally:
file_buffer.close()
据我们了解,该csv.writer
并不需要进行自我封闭。 更确切地说,只有buffer
上方和file_stream
需要被关闭。
我们运行在上述过程deferred
,通过App Engine的任务队列调用。 最终,我们得到以下错误,我们的任务的几个调用后:
服务11名的请求后总超过128 MB与142 MB软专用空间限制
很明显,那么,有在我们的应用程序内存泄漏。 但是,如果上面的代码是正确的(我们承认可能不是如此),那么我们唯一的其他想法是,正在通过我们的请求提供服务的一些持有大量的内存(作为错误信息提示)。
因此,如果一些实体是由应用程序引擎的执行过程中保持我们想deferred
。 我们还应该注意到,我们的CSV最终成功写入,尽管这些错误消息。