Python 导入CSV花费的时间太长 问题

Python 导入CSV花费的时间太长 问题,python,google-app-engine,Python,Google App Engine,我正在写一个应用程序引擎卡拉ok目录应用程序。该应用程序非常简单:在第一个版本中,它提供了将CSV歌曲列表导入目录并显示它们的功能 我在CSV导入方面有问题:在我的开发环境中导入17500条记录需要很长时间(14小时)。在生产环境中,它导入大约1000条记录,然后崩溃,代码为500。我正在浏览日志,但没有发现任何有用的线索 代码 样本数据 笔记 在开发环境中,我尝试导入多达17500条记录,但没有遇到崩溃 起初,记录的创建和插入速度很快,但随着数据库规模的扩大,创建和插入记录所需的时间会增加到

我正在写一个应用程序引擎卡拉ok目录应用程序。该应用程序非常简单:在第一个版本中,它提供了将CSV歌曲列表导入目录并显示它们的功能

我在CSV导入方面有问题:在我的开发环境中导入17500条记录需要很长时间(14小时)。在生产环境中,它导入大约1000条记录,然后崩溃,代码为500。我正在浏览日志,但没有发现任何有用的线索

代码 样本数据 笔记
  • 在开发环境中,我尝试导入多达17500条记录,但没有遇到崩溃
  • 起初,记录的创建和插入速度很快,但随着数据库规模的扩大,创建和插入记录所需的时间会增加到每条记录几秒钟
如何加快导入操作?任何建议、暗示或提示都将不胜感激

更新 我听从了默夫的建议,使用
KeyProperty
将一首歌链接回目录。17500条记录的结果是大约4分20秒——这是一个巨大的进步。这意味着,我并没有完全理解NDB是如何在AppEngine中工作的,我还有很长的路要走


虽然这是一个很大的进步,但4分钟以上的时间显然还是太长了。我现在正在研究Tim和Dave的建议,进一步缩短我的应用程序的感知响应时间。

在Google app Engine的数据存储中,对实体组的写入限制为每秒1次

因为您为每首歌曲指定了一个“父”键,所以它们最终都位于一个实体组中,这非常缓慢


仅使用KeyProperty跟踪这种关系是否可以接受?虽然数据可能会有更多的一致性问题,但速度会快得多。

在Google App Engine的数据存储中,对实体组的写入限制为每秒1次

因为您为每首歌曲指定了一个“父”键,所以它们最终都位于一个实体组中,这非常缓慢


仅使用KeyProperty跟踪这种关系是否可以接受?虽然数据可能会有更多的一致性问题,但速度会快得多。

在Google App Engine的数据存储中,对实体组的写入限制为每秒1次

因为您为每首歌曲指定了一个“父”键,所以它们最终都位于一个实体组中,这非常缓慢


仅使用KeyProperty跟踪这种关系是否可以接受?虽然数据可能会有更多的一致性问题,但速度会快得多。

在Google App Engine的数据存储中,对实体组的写入限制为每秒1次

因为您为每首歌曲指定了一个“父”键,所以它们最终都位于一个实体组中,这非常缓慢


仅使用KeyProperty跟踪这种关系是否可以接受?这会快得多,尽管数据可能有更多的一致性问题。

除了关于实体组的其他答案外,如果导入过程将花费60秒以上的时间,请使用任务,那么您有10分钟的运行时间


将csv作为BlobProperty存储在实体中(如果已压缩除了其他答案:实体组外,如果导入过程将花费60秒以上的时间,请使用任务,则您有10分钟的运行时间


将csv作为BlobProperty存储在实体中(如果已压缩除了其他答案:实体组外,如果导入过程将花费60秒以上的时间,请使用任务,则您有10分钟的运行时间


将csv作为BlobProperty存储在实体中(如果已压缩除了其他答案:实体组外,如果导入过程将花费60秒以上的时间,请使用任务,则您有10分钟的运行时间


将csv作为BlobProperty存储在实体中(如果首先压缩,则Tim走上了正确的道路。如果您无法在60秒内完成工作,请推迟到某个任务。但是如果您无法在10分钟内完成工作,请依靠,它将处理csv的工作分配到多个任务中。请参阅,其中包含您需要的部分内容

对于开发时间的缓慢性,在启动dev_appserver时是否使用
--use_sqlite
选项

Murph谈到了问题的另一部分。使用实体组,您可以执行的插入次数(每个实体组)受到限制。尝试使用单个父级插入17500行根本不起作用。这将需要大约5个小时

那么,您真的需要一致的读取吗?如果这是一次性上载,您可以执行非祖先插入(将目录作为属性),然后等待数据最终变得一致吗?这简化了查询


如果您确实绝对需要一致的读取,那么您可能需要在多个父密钥之间拆分写入。这将提高您的写入速率,而代价是使您的祖先查询更加复杂。

首先,Tim走上了正确的道路。如果您无法在60秒内完成工作,请推迟到任务。但是如果您无法完成,请推迟在10分钟内完成工作,依靠,它将处理csv的工作分配到多个任务中。请参阅,其中有一些您需要的部分

对于开发时间的缓慢性,在启动dev_appserver时是否使用
--use_sqlite
选项

Murph谈到了问题的另一部分。使用实体组,您可以执行的插入次数(每个实体组)受到限制。尝试使用单个父级插入17500行根本不起作用。这将需要大约5个小时

那么,您真的需要一致的读取吗?如果这是一次性上载,您可以执行非祖先插入(将目录作为属性),然后等待数据最终变为一致吗
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