【发布时间】:2012-04-13 22:54:54
【问题描述】:
我通过 HTTP 收到了一些多行数据并将其保存在一个字符串中。我只需要过滤包含特定关键字的行并将其写入文件。
如何在不消耗过多内存的情况下处理这些单独的行? IE。没有在换行符处拆分输入字符串然后处理列表?
也欢迎特定于 Jython 的解决方案。
【问题讨论】:
标签: python jython multiline multilinestring
我通过 HTTP 收到了一些多行数据并将其保存在一个字符串中。我只需要过滤包含特定关键字的行并将其写入文件。
如何在不消耗过多内存的情况下处理这些单独的行? IE。没有在换行符处拆分输入字符串然后处理列表?
也欢迎特定于 Jython 的解决方案。
【问题讨论】:
标签: python jython multiline multilinestring
我现在实际测试了在 Jython 中使用 data.split('\n')、re.finditer('.*?\n', data) 和 StringIO.readline() 的内存要求。我惊讶地发现 split() 并没有增加使用的内存(PS Old Gen),StringIO 排在第二位和第三位。
Jython 2.5.1+:
split() +0 x data
StringIO +2 x data
re +4 x data
Jython 2.2.1:
split() +0 x data
re +2 x data
StringIO +7 x data
StringIO 在 .write() 调用之后没有使用额外的内存,即它似乎由 Jython 中的相同字符串支持。
我没有测试速度。
【讨论】:
使用StringIO 模块将您的字符串作为类似文件的对象进行访问。然后你可以像对文件一样遍历行。
【讨论】:
StringIO 在内存方面不一定比 .split() 好,因为它是可变的,它不一定由 same string 作为支持初始值。
StringIO 对象并读取不需要额外的内存,我的测试证实了这一点。
StringIO 模块似乎确实按照您的建议行事,但较新的 io.StringIO 类确实不, Jython 的 cStringIO 实现也没有(我还没有检查 CPython 的 cStringIO)。
由于str.split 没有迭代器版本,最好的办法是使用re 模块来模拟它:
for line in re.finditer('.*?\n', data):
# do stuff
但是,请注意,与常规的 split 方法不同,这将保留尾随换行符。
【讨论】:
你可以尝试使用编译好的正则表达式python re
【讨论】: