我有一个3Gb csv文件。我想将所有数据写入GAE数据存储区。我已经尝试逐行读取文件,然后将数据发布到我的应用程序,但在超过免费套餐之前我只能创建大约1000个新实体并开始产生相当高的成本。将此数据上传到数据存储区的最有效/最具成本效益的方法是什么?
答案 0 :(得分:2)
如果您需要将每一行存储为一个单独的实体,那么创建这些实体的方式并不重要 - 您可以通过批量处理请求来提高性能,但这不会影响成本。
费用取决于您在每个实体中拥有的索引属性数量。确保只索引需要编制索引的属性。
答案 1 :(得分:1)
最好的办法是使用mapper。这是一个档案吗?如果是这样,请将其分解为尽可能多的较小文件,然后使用映射器填充数据库。你打破它们的原因是映射器将每个文件发送到它自己的线程。所以文件越多,你拥有的线程越多,工作的速度就越快。
类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