我们有一个App Engine应用程序,可以将大量相对较大的文件写入Google Cloud Store。这些文件是动态创建的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
期间App Engine是否保留了某些实体。我们还应该注意,尽管存在这些错误消息,但我们的CSV最终已成功写入。
答案 0 :(得分:2)
描述的症状不是必然指示应用程序内存泄漏。可能的替代解释包括:
相关Q& As: