python-3.x 将非常大的txt文件导入Dynamobd

e3bfsja2  于 2022-12-24  发布在  Python
关注(0)|答案(1)|浏览(130)

我有一个巨大的txt文件,我需要把它放在DynamoDB上。文件结构是:
223344|蓝色和橙子|红色|16/12/2022
223344|蓝色和橙子|红色|2022年12月16日
此文件超过2亿行
我曾试图使用下面的代码转换它的json文件:

import json

with open('mini_data.txt', 'r') as f_in:
    for line in f_in:
        line = line.strip().split('|')        
        filename = 'smini_final_data.json'
        result = {"fild1": line[0], "field2": line[1], "field3": str(line[2]).replace(" ",""),"field4":line[3]}
        with open(filename, "r") as file:
            data = json.load(file)
        data.append(result)
        with open(filename, "w") as file:
            json.dump(data, file)

但这效率不高,而且这只是工作的第一部分(将数据转换为Json),在此之后,我需要将Json放入dynamoDB。
我用过这个代码(它看起来不错):

def insert(self):
        if not self.dynamodb:
            self.dynamodb = boto3.resource(
                'dynamodb', endpoint_url="http://localhost:8000")
        table = self.dynamodb.Table('fruits')

        json_file = open("final_data.json")
        orange = json.load(json_file, parse_float = decimal.Decimal)

        with table.batch_writer() as batch:
            for fruit in orange:
                fild1 = fruit['fild1']
                fild2 = fruit['fild2']
                fild3= fruit['fild3']
                fild4 = fruit['fild4']

                batch.put_item(
                    Item={
                        'fild1':fild1,
                        'fild2':fild2,
                        'fild3':fild3,
                        'fild4':fild4
                    }
                )

那么,有没有人,有一些建议,以处理此文本更有效?
谢啦,谢啦

k4emjkb1

k4emjkb11#

在这种情况下,将分隔文本转换为JSON的步骤似乎是不必要的。您编写它的方式需要为分隔文本文件的每一行重新打开并重写JSON文件。重复2亿次的I/O开销确实会降低速度。
我建议直接从分隔文本转到DynamoDB。它可能类似于:

dynamodb = boto3.resource(
    'dynamodb', endpoint_url="http://localhost:8000")
table = self.dynamodb.Table('fruits')

with table.batch_writer() as batch:
    with open('mini_data.txt', 'r') as f_in:
        for line in f_in:
            line = line.strip().split('|')
            batch.put_item(
                Item={
                    'fild1':line[0],
                    'fild2':line[1],
                    'fild3':str(line[2]).replace(" ",""),
                    'fild4':line[3]
                }
            )

相关问题