如何在ASP.NET Core上将大型数据集加载到内存中?

时间:2017-01-22 07:17:13

标签: c# asp.net asp.net-core

上下文:

  • 我正在构建一个API来支持搜索查询建议功能。
    • 例如,对“/ api / values / micro”的GET请求将返回“微波炉”,“微管理器”等建议。
  • 我正在使用ASP.NET Core构建此API(托管在Azure上)。
  • 我将使用trie数据结构快速获取搜索结果。
  • 我有一个包含大约700万行数据的文件。每一行都是维基百科文章的标题。
  • 我将使用此文件中的数据播种此trie。
  • 我没有将此数据文件嵌入到我的Visual Studio项目中并将其部署到Azure,而是希望将此数据文件上传到Azure blob存储。
  • 在初始化时,我需要我的ASP.NET Core API从blob存储中获取此文件并将其作为trie加载到内存中,以便后续的HTTP请求可以快速从此trie中检索数据(没有意义这样做每个请求)。

问题:

如何在HTTP请求开始进入之前的初始化时加载此数据?我是否在控制器的构造函数中执行此操作?在我的Startup.cs中?我很感激这里有一些指导。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果要在调用控制器中的任何代码之前确保已加载此数据,则可以将其放在用于引导应用程序的{{1}}类中。

答案 1 :(得分:1)

我会在Configure方法中执行此操作。代码应该是这样的,然后webapp将可用,直到数据被预加载。

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
        {
            //service should has been configured in ConfigureServices step
            //Create method to check if data loaded. If not then load them.
            serviceScope.ServiceProvider.GetService<ApplicationDbContext>().CheckDataLoaded();
        }
        //more steps here..