【问题标题】:Pattern for batching and bulk processing批处理和批量处理模式
【发布时间】:2010-12-17 19:28:02
【问题描述】:

我从数据库查询的数据看起来很像以下

Job Site    File    List
-------------------------------
1   SiteA   file2.txt   2
2   SiteB   file2.txt   2
3   SiteA   file23.txt  23
4   SiteC   file2.txt   2
5   SiteB   file12.txt  12
6   SiteA   file29.txt  29
7   SiteB   file28.txt  28

我应该为每个站点(站点 A、B 和 C)启动实例,然后进行处理,例如,对于站点 A,处理 file2.txt、file23.txt 和 file29.txt。这种“处理”可以按某种顺序进行,但必须一个接一个(不能同时进行)。

所以我的第一个任务是整理站点 - 并为每个站点创建实例。我该怎么做?

PS:我认为对于处理部分,我应该使用某种迭代器模式...我更喜欢任何现代编译器语言的解决方案...如 c#、vb、c++ 等...

【问题讨论】:

    标签: design-patterns batching


    【解决方案1】:

    我赞同为每个站点配备一名工作人员的想法。

    另一个问题 - 应用程序状态。

    当您的应用启动时,它是否关心之前发生的事情?考虑当一些文件已被处理时应用程序崩溃。重新启动时,应用程序可能会再次处理文件?有问题吗?

    【讨论】:

      【解决方案2】:

      我将有一个带有哈希表的访问者对象,该哈希表遍历每个条目。

      对于每个条目: - 如果它在哈希表中不存在,访问者对象将为它实例化一个站点。 - 然后对象将获取文件并对其进行处理。

      这样做的好处是您可以一次性完成分组和处理。

      【讨论】:

        【解决方案3】:

        我不确定我是否理解您想要实现的目标,但我认为您需要做的是:

        1. 从您的数据中获取 Site 的不同值
        2. 对于上一步中获得的每个值
          2.1。实例化网站
          2.2.获取File的所有关联值并处理每一个

        在使用 LINQ 的 C# 中,它会是这样的:

        var siteNames=data.Select(d => d.Site).Distinct();
        foreach(var siteName in siteNames) {
            var site=new Site(siteName); //Or use a factory method, a sites list, etc
            var files=data.Where(d => d.Site==site).Select(d => d.File);
            foreach(var file in Files) {
                site.ProcessFile(file);
            }
        }
        

        【讨论】:

        • 不能使用任何类型的循环......这是我发现迭代器模式是最好的工作......你也可以显示同一事物的非 linq 版本......
        猜你喜欢
        • 2019-08-22
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-31
        • 2017-02-01
        • 1970-01-01
        • 2020-02-12
        相关资源
        最近更新 更多