将3GB数据写入数据存储区的最有效方法是什么?

时间:2014-11-13 19:45:30

标签: python-2.7 google-app-engine google-cloud-datastore

我有一个3Gb csv文件。我想将所有数据写入GAE数据存储区。我已经尝试逐行读取文件,然后将数据发布到我的应用程序,但在超过免费套餐之前我只能创建大约1000个新实体并开始产生相当高的成本。将此数据上传到数据存储区的最有效/最具成本效益的方法是什么?

2 个答案:

答案 0 :(得分:2)

如果您需要将每一行存储为一个单独的实体,那么创建这些实体的方式并不重要 - 您可以通过批量处理请求来提高性能,但这不会影响成本。

费用取决于您在每个实体中拥有的索引属性数量。确保只索引需要编制索引的属性。

答案 1 :(得分:1)

最好的办法是使用mapper。这是一个档案吗?如果是这样,请将其分解为尽可能多的较小文件,然后使用映射器填充数据库。你打破它们的原因是映射器将每个文件发送到它自己的线程。所以文件越多,你拥有的线程越多,工作的速度就越快。

阅读GCSMapreduce了解更多信息

类MainPage(webapp2.RequestHandler):

def get(self):
    bucketName = "" #Bucketname
    listOfFiles = gcs.listbucket("/" + bucketName + "path to folder with the files")

    pipeline = Mapreduce(bucketName, listOfFiles)
    pipeline.start()
    self.redirect(pipeline.base_path + "/status?root=" + pipeline.pipeline_id)

class Mapreduce(base_handler.PipelineBase):
    def run(self, bucketName, listOfFiles):
        yield mapper_pipeline.MapperPipeline(
            "Fill Data",
            "main.FillDB",
            "mapreduce.input_readers._GoogleCloudStorageInputReader",
            params = {"input_reader" : {
                                 "bucket_name" : bucketName,
                                 "objects" : listOfFiles
                                 }                                 
                             },

            shards=64)

def FillDB(data):
    for line in data:
        infoForDb = line.split(",")
        inputDB = EntityName(id=infoForDb[0], productName=infoForDb[1])
        db.put(inputDB)
    return