1

我有一组 JSON 消息。每个都有一个唯一的 id 作为字段。一些消息是其他消息的父消息,例如

{"id":"idX", ..., "parents":["idA", "idB", "idC"]}

每条消息都有其他字段,但它们与此问题无关。

每条消息都存储在 AWS-S3 上的一个文件中。我还有一个 DynamoDB 表,它id用作键并包含有关相应消息在 S3 上的存储位置的信息,包括文件路径和消息的字节偏移量以启用直接读取。

给定一个id0,我需要生成完整的树,以递归地用其消息的全部内容实质上替换每个父级的 id。所以下面的例子被扩展成这样:

{"id":"idX", ..., "parentContents":[{"id":"idA", ...}, {"id":"idB", ...}, {"id":"idC", ...}]}

以同样的方式扩展的父母等等。最后,我得到了一条以开头为根id{ABC}的树形 JSON 消息。id0

当前的算法本质上是这样的(在类似 Python 的伪代码中):

def get_message(id):

    # 1. get location info for id from DynamoDB
    # 2. get message for id (mJSON) using location info by direct read from its S3 file
    # 3. Parse the JSON and find list of parent ids (parentIds)
    # 4. Recusrively expand parents:
    for pid in parentIds:
        pJSON = get_message(pid)
        # 4.1. Insert pJSON into mJSON
    # 5. Return full tree for id
    return mJSON 

所以我基本上以深度优先的方式构建树。这种实现对于大树来说很慢。我需要加快速度。

我还没有对我的代码进行详细的分析,但我怀疑一个瓶颈是在第 4 步从 DynamoDB 读取单个项目。我玩了一点,batch_get_item但我注意到,get_item当列表中的一个键在表中不存在时,它不会抛出异常。是否有不同的批量读取方法会抱怨未找到密钥?

我正在考虑使用batch_get_item或类似的东西并重构代码以立即从 DynamoDB 读取给定 id 的所有父记录。你认为这会加快速度吗?

有没有办法从多个 S3 文件中批量直接读取?目前,我正在使用以下块进行单次读取:

key = s3bkt.lookup(inFile)
line = key.get_contents_as_string(headers={"Range":"bytes="+str(fromOffset)+"-"+str(toOffset)})

另外,您是否怀疑其他瓶​​颈?

谢谢!

4

0 回答 0