Python 帮助延迟加载大型数据集

Posted

技术标签:

【中文标题】Python 帮助延迟加载大型数据集【英文标题】:Python help lazy loading large data sets 【发布时间】:2015-05-19 19:59:16 【问题描述】:

我有一个将数据加载到数据库中的脚本。我从 csv 文件中获取数据并返回一个生成器。生成器产生的值用于构建插入语句,以便一次批量加载多达 100K 条记录。目前我有一个看起来像这样的函数来构建一个“列表列表”:

def split_statements(data_set, num_of_splits):
        return iter([data_list[pos:pos + num_of_splits] for pos in xrange(0, len(data_list), num_of_splits)])

这适用于 1 行到数百万行数据,将后者分成 100K 块。但是,我一直在尝试为超大文件的边缘情况切换到某种生成器/延迟加载功能。我尝试了以下方法:

def split_statements(data_set, num_of_splits):
    for i in data_set:
        yield list(islice(data_set, num_of_splits))

这看起来很笨重,并且在文件中只有 1 行时不起作用。但是它在 10GB 文件上运行良好。

感谢任何见解/帮助。

谢谢!

【问题讨论】:

我不确定这是否非常适合代码审查,至少在措辞上是这样的:“当文件中只有 1 行时不起作用” 听起来好像代码在按预期工作之前仍然存在问题,在这种情况下,最好留在 Stack Overflow。 把问题放在这两个地方有问题吗? @Phrancis 我同意 (c: @user982599 最好不要同时在 Code Review 和 Stack Overflow 上发布,因为它可能会在其中一个站点或另一个站点上偏离主题。在这种情况下,我看到你刚刚在 CR 上发布了它,它很可能会在那里关闭。 :( 抱歉 - 我将删除 CR 上的问题 【参考方案1】:

我怀疑它是否真的适用于 10GB 文件。我不知道您的data_set,但我认为for i in data_set 将始终从data_set 读取下一个元素并将其作为i 提供,然后您将忽略它。这可以解释为什么 1 行文件不起作用。 10GB 的文件可能也不起作用,并且丢失了所有被浪费为 i 的行。

演示:

from itertools import islice
it = iter('abcabcabc')
for i in it:
    print(list(islice(it, 2)))

输出:

['b', 'c']
['b', 'c']
['b', 'c']

【讨论】:

当我在包含单行数据的文件上执行以下操作时:f = open('data1.csv','rb'),然后 r = csv.reader(f),然后将我的方法或您的方法应用于该文件我仍然以 [] 作为我的结果。 我的数据的一个简单示例类似于:'joe user','2015-05-11T22:10:54','Application Launch Event','X.X.X.X','Application Name ','3:57:14' 我的方法是什么意思?我只是用 yours 来演示问题。 我发现问题在于向函数提供的数据。只传递一个字符串就可以了。但是我正在传递元组,这就是我得到 [ ] 的原因。 不知道你在说什么。 “只传递一个字符串就可以了”,你的意思是我的演示吗?如果是这样,您是否没有看到每个“a”都丢失了?

以上是关于Python 帮助延迟加载大型数据集的主要内容,如果未能解决你的问题,请参考以下文章

延迟加载 Flash 对象

具有代码拆分和延迟加载减速器的同构 Redux

Catel 延迟加载包含视图/视图模型的程序集

Angular 2 延迟加载技术

延迟加载 JSTREE

如何使用 mongodb 数据延迟加载角度