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 帮助延迟加载大型数据集的主要内容,如果未能解决你的问题,请参考以下文章