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

就餐:初始化缓慢的原因

松英喆
2023-03-14

我发现初始化模型的速度非常慢。完成需要40秒!

我的代码包含两个主要部分:1)CSV数据读取器将首先运行以加载数据,这需要不到1秒的时间来完成35000行的读取和处理(请参见下面的第一部分代码);2) 随后初始化代理和边。特别是,Edge初始化将使用CSV reader中加载的数据(参见下面的第二部分代码)。

第一部分:CSVReader代码

public class DataReader {

    private String csvFile;
    private List<String> sub = new ArrayList<String>();
    private List<List> master = new ArrayList<List>();


    public void ReadFromCSV(String csvFile) {

        String line = "";
        String cvsSplitBy = ",";

        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
            System.out.println("Header " + br.readLine());
            while ((line = br.readLine()) != null) {

                // use comma as separator
                String[] list = line.split(cvsSplitBy);
//                System.out.println("the size is " + country[1]);
                for (int i = 0; i < list.length; i++) {
                    sub.add(list[i]);
                }
                List<String> temp = (List<String>) ((ArrayList<String>) sub).clone();
//                master.add(new ArrayList<String>(sub));
                master.add(temp);
                sub.removeAll(sub);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println(master);
    }

    public List<List> getMaster() {
        return master;
    }

}

这是CSVReader使用的输入文件:

第二部分:边缘(路由)初始化代码。我怀疑是查询循环消耗了大量的初始化时间:

//      add route network
        Network<Object> net = (Network<Object>)context.getProjection("IntraCity Network");
        IndexedIterable<Object> local_hubs = context.getObjects(LocalHub.class);
        for (int i = 0; i <= CSV_reader_route.getMaster().size() - 1; i++) {
            String source = (String) CSV_reader_route.getMaster().get(i).get(0);
            String target = (String) CSV_reader_route.getMaster().get(i).get(3);
            double dist = Double.parseDouble((String) CSV_reader_route.getMaster().get(i).get(6));
            double time = Double.parseDouble((String) CSV_reader_route.getMaster().get(i).get(7));

            Object source_hub = null;
            Object target_hub = null;
            Query<Object> source_query = new PropertyEquals<Object>(context, "hub_code", source);
            for (Object o : source_query.query()) {
                if (o instanceof LocalHub) {
                    source_hub = (LocalHub) o;
                }
                if (o instanceof GatewayHub) {
                    source_hub = (GatewayHub) o;
                }
            }

            Query<Object> target_query = new PropertyEquals<Object>(context, "hub_code", target);
            for (Object o : target_query.query()) {
                if (o instanceof LocalHub) {
                    target_hub = (LocalHub) o;
                }
                if (o instanceof GatewayHub) {
                    target_hub = (GatewayHub) o;
                }
            }

            if (net.getEdge(source_hub, target_hub) == null) {
                Route this_route = (Route) net.addEdge(source_hub, target_hub);
                context.add(this_route);
                this_route.setDist(dist);
                this_route.setTime(time); }
            }



        }

更新:根据我的测试,我发现这条线会大大减慢初始化过程。

context.add(this_route);

没有这条线,只花了3秒钟就完成了。用这条线,模特花了20秒!语境的潜在机制是什么。添加()?如何解决和改善这个问题?

共有1个答案

贺亦
2023-03-14

将边添加到上下文中时,随着上下文中的搜索空间变大,查询的计算成本会变得更高。因此,也许不在csv阅读器循环中向上下文添加边会有所帮助。您可以像现在一样创建边,但可以将其添加到列表中,而不是添加到上下文中。技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能技能。然后,当读卡器循环完成时,html" target="_blank">遍历该列表并将边添加到上下文中。

如果这没有帮助,那么至少我们知道添加到我们可以尝试追踪的上下文中还有一个额外的副作用。

 类似资料:
  • 问题内容: 假设您做简单的事情: 现在,随着运行的http://本地主机作为 它需要完成。 现在尝试https:// localhost 这需要。 现在在linux或docker中运行相同的东西: http: https: 为什么是这样?为什么平台之间会有如此巨大的差异?你能为这个做什么? 对于长时间运行的应用程序服务器以及具有各自冗长且繁琐的初始化序列的应用程序,这5秒可能无关紧要。 但是,在许

  • 我正在用Apache CXF 2.7.8开发web服务。我使用wsdl2java来生成SEI和实现。有数百个web服务endpoint。 我使用嵌入式码头。 当服务器启动时,初始化每个endpoint需要几个小时。 我曾经使用 Endpoint.publish(地址、实现器)方法发布endpoint,但我发现通过这种方式,可以为每个服务创建一个 JAXBContext 实例。我修复了为每个服务使用

  • 我正在解决LeetCode.com的一个问题。问题是这样的: 这不是不正确吗?因为如果,那么这不是意味着抢劫相同的房子吗(因为我们将和初始化为相同的值?)即使我们假设,和不是连续的房屋吗? 完整代码(如果需要)如下:

  • 结果将是: 我对这个结果感到困惑,因为根据标准规则,不是静态初始化,是静态初始化,因为这些: 变量或临时对象o的常量初始值设定项是其完全表达式为常量表达式的初始值设定项,但如果o是对象,则这样的初始值设定项也可以为o及其子对象调用constexpr构造函数,即使这些对象是非文字类类型。 如果实体的常量初始值设定项初始化具有静态或线程存储持续时间的变量或临时对象,则执行常量初始化。如果不执行常量初始

  • 问题内容: 我退出该应用程序,然后重新启动,但出现异常。 例外 清单文件 编辑: 我不知道为什么Parse会为此抛出异常。为什么不只是继续前进。它已初始化,如果我再次对其进行初始化,那么大的麻烦。 解 我放弃了解析。不喜欢Application的方式,只是为了维护。 问题答案: 整个应用程序 只应调用 一次 。 在的函数中调用它可能导致多次初始化,因为 在应用程序的生命周期中可以多次创建Activ

  • 大家好,我是Kotlin语言的新手,在运行Hello World代码的过程中遇到了一些错误。 无法为初始化脚本'C:\User\HP\AppData\Local\Temp\wrapper_init.gradle'打开初始化泛型类缓存(C:\User\HP. gradle\cache\6.8\script\5mjee5vr2mabvexqryui51pg)。 缺陷源单元“BuildScript”中的