我们有一个非结构化数据的大型数据集(Azure Blob),并且已经开始注意到在加载了几千条记录后刷新我们的模型变得非常慢。
我们当前的查询结构是:
#"Load Data"
Loads data from the Azure Blob, ~1000 files
Parses the files into a table with 3 columns (of list/record types which can be further expanded), ~700k rows
#"Sessions"
Reference #"Load Data"
Expand all 'Session' related columns
#"Users"
Reference #"Load Data"
Expand all 'User' related columns
#"Events"
Reference #"Load Data"
Expand all 'Event' related columns
#"Events By Name"
Reference #"Events"
Groups by 'event.name'- generates a column of tables to each event type's events and properties (these vary between events)
#"Event Name1" (2, 3, etc. one table per event type)
Reference #"Events by Name"
Expands that event name's Table, and generates a table with event.id and each of the properties for that event type
在运行此操作并观察资源监视器时,内存使用率会上升,并最终导致大量硬故障导致磁盘使用。通过查看查询执行弹出窗口,似乎有一堆查询启动并且并行运行。
如果我从本地文件夹加载数据,它们似乎都在获取数据,浏览文件并并行加载引用的常见查询。我相信这就是导致内存使用量变得混乱,启动磁盘以及需要花费数小时才能运行的查询的原因。
我假设引用的查询首先运行一次,然后使用它来查询由各个查询引用的结果表,但似乎并非如此。我也尝试过使用Table.Buffer作为#"加载数据"的最后一步。和#"事件",试图使这些查询计算一次然后在家属之间共享,但这似乎只会使情况变得更糟。有办法:
我只是以错误的方式看待这个?很多'表现'我发现的文章只提到构造您的查询以允许查询折叠。然而,对于我们目前的情况来说这不可能,因为Azure Blob存储实际上只是存储'必须在本地加载和解析的文件。
在我们当前的700k测试事件中运行这些查询是一项真正的努力,我们预计它会在真实环境中达到数百万。我们唯一的选择是处理blob并将数据推送到SQL数据库并将我们的模型链接到那个?
答案 0 :(得分:0)
首先处理数据并将其存储到数据库的表中,然后将此表用作模型的数据源。通过运行按计划间隔运行的作业来刷新源表中的数据并更新表。