我通过 HTTP 收到了一些多行数据并将其放在一个字符串中。我只需要过滤包含特定关键字的行并将其写入文件。
如何在不消耗过多内存的情况下处理这些单独的行?即没有在换行符处拆分输入字符串然后处理列表?
也欢迎特定于 Jython 的解决方案。
我通过 HTTP 收到了一些多行数据并将其放在一个字符串中。我只需要过滤包含特定关键字的行并将其写入文件。
如何在不消耗过多内存的情况下处理这些单独的行?即没有在换行符处拆分输入字符串然后处理列表?
也欢迎特定于 Jython 的解决方案。
由于没有迭代器版本str.split
,最好的办法是使用re
模块来模拟它:
for line in re.finditer('.*?\n', data):
# do stuff
split
但是,请注意,与常规方法不同,这将保留尾随换行符。
我现在实际测试了在 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
在 .write() 调用之后,StringIO 没有使用额外的内存,即它似乎由 Jython 中的相同字符串支持。
我没有测试速度。
您可以尝试使用已编译的正则表达式python re
使用StringIO模块将您的字符串作为类似文件的对象进行访问。然后,您可以像对文件一样遍历行。