问题
我正在编写一个应用引擎卡拉 OK 目录应用程序。该应用程序非常简单:在第一个版本中,它提供了将 CSV 歌曲列表导入目录并显示它们的功能。
我在导入 CSV 时遇到问题:在我的开发环境中导入 17,500 条记录需要很长时间(14 小时)。在生产环境中,它导入了大约 1000 条记录,然后以代码 500 崩溃。我正在查看日志,但没有找到任何有用的线索。
编码
class Song(ndb.Model):
sid = ndb.IntegerProperty()
title = ndb.StringProperty()
singer = ndb.StringProperty()
preview = ndb.StringProperty()
@classmethod
def new_from_csv_row(cls, row, parent_key):
song = Song(
sid=int(row['sid']),
title=row['title'],
singer=row['singer'],
preview=row['preview'],
key=ndb.Key(Song, row['sid'], parent=parent_key))
return song
class CsvUpload(webapp2.RequestHandler):
def get(self):
# code omit for brevity
def post(self):
catalog = get_catalog(…) # retrieve old catalog or create new
# upfile is the contents of the uploaded file, not the filename
# because the form uses enctype="multipart/form-data"
upfile = self.request.get('upfile')
# Create the songs
csv_reader = csv.DictReader(StringIO(upfile))
for row in csv_reader:
song = Song.new_from_csv_row(row, catalog.key)
song.put()
self.redirect('/upload')
样本数据
sid,title,singer,preview
19459,Zoom,Commodores,
19460,Zoot Suit Riot,Cherry Poppin Daddy,
19247,You Are Not Alone,Michael Jackson,Another day has gone. I'm still all alone
笔记
- 在开发环境中,我尝试最多导入 17,500 条记录,没有遇到崩溃
- 起初,记录的创建和插入速度很快,但随着数据库增长到数千个,创建和插入记录所需的时间增加到每条记录几秒钟。
如何加快导入操作?任何建议、提示或提示将不胜感激。
更新
我听从了 Murph 的建议,并使用 aKeyProperty
将歌曲链接回目录。结果对于 17,500 条记录大约需要 4 分 20 秒——这是一个巨大的进步。这意味着,我还没有完全理解 NDB 在 App Engine 中的工作原理,而且我还有很长的路要走。
虽然是一个很大的改进,但 4 分钟以上的时间无疑还是太长了。我现在正在研究 Tim 和 Dave 的建议,以进一步缩短我的应用程序的感知响应时间。