当前位置: 首页 > 知识库问答 >
问题:

Azure Blobs C#客户端-使用多个过滤器服务器端

屈晨
2023-03-14

我试图在我的程序中加载用于过滤的blob名称,然后在应用所有过滤器后,我计划下载并处理每个blob。目前,我们在存储中有大约30kblob,它们存储在容器中,如下所示:年/月/日/小时/file.csv(或file.json未处理的文件)

我的程序需要动态输入下载的开始和结束日期(最长30天)。使用Azure。Blobs.BlobContainerItem和方法GetBlobs允许我使用单个字符串前缀进行服务器端过滤。

如果我的日期是2020/06/01和2020/06/02,程序运行得非常快,需要大约2秒才能获得斑点并将其余的过滤器应用到它。然而,如果我有2020/05/30和2020/06/01,那么我无法输入月份前缀,因为它只需要1个字符串,所以我的前缀将仅为2020,这需要大约15秒才能完成。其余的过滤是在本地完成的,但最大的延迟是GetBlobs()函数。

是否有其他方法从.NETCore应用程序在服务器端使用多个筛选器?

以下是相关功能:

        BlobContainerClient container = new BlobContainerClient(resourceGroup.Blob, resourceGroup.BlobContainer);
        var blobs = container.GetBlobs(prefix : CreateBlobPrefix(start, end))
            .Select(item=> item.Name)
            .ToList();
        blobs = FilterBlobList(blobs, filter, start, end);

    private string CreateBlobPrefix(DateTime start, DateTime end)
    {
        string prefix = null;
        bool sameYear = start.Year == end.Year;
        bool sameMonth = start.Month == end.Month;
        bool sameDay = start.Day == end.Day;
        if (sameYear)
        {
            prefix = start.Year.ToString();
            if (sameMonth)
            {
                if(start.Month<10)
                    prefix += "/0" + start.Month.ToString();
                else
                    prefix += "/" + start.Month.ToString();
                if (sameDay) 
                    if(start.Day<10)
                        prefix += "/0" + start.Day.ToString();
                    else
                        prefix += "/" + start.Day.ToString();
            }
        }
        return prefix;

编辑:下面是我最后是怎么做的。由于使用更好的指定前缀进行多个请求更快,我执行了以下操作:

    < li >在选定的时间窗口中创建不同日期的列表(来自用户输入任何窗口的UI应用程序) < li >对于创建的每个前缀,我向Azure发送请求以获取blob < li >将所有blob名称连接到一个列表中 < li >通过对每个blob名称使用blob客户端来处理列表

这是代码:

        foreach (var blobPrefix in CreateBlobPrefix(start, end))
        {
            var currentList = container.GetBlobs(prefix: blobPrefix)
                .Select(item => item.Name)
                .ToList();
            blobs = blobs.Concat(currentList).ToList();
        }

共有1个答案

幸弘扬
2023-03-14

您可以多次过滤,查找日期之间的公共分母:

首先使用字符串前缀按开始月份和年份 2020/05 进行筛选,然后在本地筛选确切的日期。

然后,您可以逐渐增加日/月过滤器,直到到达范围的末尾。

步进的粒度实际上取决于为给定的平均结果数调用Azure所需的时间。另一个优点是可以并行运行这些子查询。

我用过这个代码

    var prefixDateFilters = Enumerable.Range(0, 1 + endDateInclusive.Subtract(startDateInclusive).Days)
                                      .Select(offset => startDateInclusive.AddDays(offset))
                                      .Select(date => $"{date.ToString(BlobFileDateTimeFormat)}").ToList();

    prefixFilters.AsParallel()
                 .Select(filter => containerClient.GetBlobs(prefix: filter))
 类似资料:
  • 问题内容: 我正在为大型数据集创建交互式可视化。由于数据集的大小,无法将其加载到浏览器中。我们正在节点服务器上使用交叉过滤器来加载和过滤服务器端数据。我想知道是否可以通过某种方式将服务器端交叉过滤器过滤器与dc.js图表​​耦合。 我现在正在使用d3.js创建图表,但是想要使用dc.js中已经存在的各种图表。我们基本上是在服务器端过滤数据,然后在客户端上侦听图表变化,然后在服务器上执行适当的过滤并

  • 我尝试使用Java中的Sockets连接到多个客户端。一切似乎都正常,但问题是,服务器只监听第一个客户端。如果有多个客户端,服务器可以向它们发送所有消息,但他可以只监听来自第一个客户端的消息。我尝试了所有这些(我从昨天开始就遇到了这个问题)。所以我很确定,错误一定在“ClientListener”类中。 说明:有一个客户端列表(用于与字符串通信的连接)。在GUI中有一个列表,我可以在其中选择要与哪

  • 问题内容: 我正在使用RMI编写密码系统的原型。 我有一个问题,因为当我启动两个客户端时,它们从OneTimePad类的服务器中的一个对象获得了响应。 因此客户端A获取为客户端b保留的密钥,由于特定的算法,这种情况不会发生。 服务器仅向客户端发送E和N变量(例如在RSA中),因此我无法序列化OneTimePad对象并通过网络发送它(因为它将具有所有密钥)。 如何为每个客户端创建OneTimePad

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 问题描述: 我们有100多个springboot服务运行在不同的环境中:dev、uat、prod等,对于每一个,我们都有eureka服务器正在运行以注册这些微服务,这没有问题,在部署一个服务之后,它会注册并且工作良好,但是当我们在本地运行一个服务时,它会在prod的eureka服务器中注册,

  • 前面的章节介绍了所有 Redis 的重要功能组件: 数据结构、数据类型、事务、Lua 环境、事件处理、数据库、持久化, 等等, 但是我们还没有对 Redis 服务器本身做任何介绍。 不过, 服务器本身并没有多少需要介绍的新东西, 因为服务器除了维持服务器状态之外, 最重要的就是将前面介绍过的各个功能模块组合起来, 而这些功能模块在前面的章节里已经介绍过了, 所以本章将焦点放在服务器的初始化过程,