【问题标题】:Cache distribution exercise as presented at googles HashCode 2017googles HashCode 2017 中介绍的缓存分配练习
【发布时间】:2020-06-14 07:56:18
【问题描述】:

我目前正在尝试找到解决此文档Hash Code 2017 - Streaming Videos 中所述问题的有效解决方案。

TLDR; 为了最大限度地减少 youtube 视频的延迟,缓存服务具有有限的 容量被使用。然而,并不是每个缓存都连接到每个 端点,并不是每个端点都请求相同的视频。目标是 以最小化整个网络的整体延迟。

我的方法是简单地遍历每个端点和每个请求块,并找到每个视频大小延迟减少最多的最佳缓存(我将称之为 request密度)

当最佳缓存已经达到其容量时,我尝试存储它以换取 请求密度较小的视频,或者如果没有其他可能,则使用不同的缓存(请注意数据中心也是我模型中的缓存)

def distribute_video_requests(endpoint, excluding_caches=set()):
    caches = endpoint.cache_connections - excluding_caches

    for vr in endpoint.video_requests:
        optimal_cache = find_optimum(caches, vr)

        exchange = try_put(optimal_cache, vr)

        if exchange["conflicting"]:
            excluding_caches.add(optimal_cache)

            for elm in exchange["affected"]:
                distribute_video_requests(elm["from"], excluding_caches)


for ep in endpoints:
    distribute_video_requests(ep)

您可以将其可视化为Brazil nut effect,其中视频请求是按堆栈排序的不同密度的片段。

我解释所有这些的原因是因为我无法真正判断我的解决方案是否合适,如果不是:有什么更好的方法?

【问题讨论】:

    标签: algorithm sorting optimization combinatorics


    【解决方案1】:

    如果有人给你一个建议的解决方案,你可以做的一件事是选择一个缓存服务器,清空它,然后尝试找出最好的方法来填充它,以获得至少与建议的。

    我认为这是背包问题,因此要找到解决此问题或原始问题的有效精确解决方案并不容易。

    背包问题有很多近似值,所以我认为可能值得对其进行编程并将其扔到您的方法中的解决方案中。如果它不能对原来的解决方案有太大的改进,那么恭喜!如果可以,你还有另一种解决方法——继续运行背包问题来调整每个缓存服务器的内容,直到找不到更多改进为止。

    【讨论】:

      【解决方案2】:

      我实际上已经使用基本的 OOP、基于流的数据读写和基本循环解决了这个问题。

      我的解决方案实际上可以在:https://github.com/TheBlackPlague/YouTubeCache 获得。

      解决方案是用 PHP 编码的,只是因为我想要一种解释语言而不是编译语言来快速完成这项工作。但是,这可以很容易地扩展到任何语言以加快执行时间。

      【讨论】:

        猜你喜欢
        • 2011-09-21
        • 2014-08-07
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        • 2020-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多