【发布时间】:2014-11-18 06:06:40
【问题描述】:
我有以下形式的数据:
#@ De
A B C.
#@ dabc
xyz def ghi.
#@ <MyName_1>
Here is example.
#@ Df
A B C.
#@ <MyName_2>
De another one.
#@ <MyName_3>
Df next one.
#@ dabc1
xyz def ghi.
#@ <MyName_4>
dabc this one.
转换成如下形式:
A B#1 C. //step 1 -- 1 assigned to the first occurrence of A B C.
xyz def#1 ghi. //1 assigned to first occurrence of xyz def ghi
Here is example
A B#2 C. //step 1 -- 2 assigned in increasing order
B#1 another one. //step 2
B#2 next one.
xyz def ghi.
def#1 this one.
// 这里代表 cmets,不是输出的一部分。
算法如下。
- 如果#@ 之后的第二行重复。然后,附加到 中间字#number,其中 number 是数字标识符,并且是 按第二行的重复顺序递增。
- 将 #@... 替换为 word#number 出现的位置。
- 删除第二行没有重复的所有#@。
为了实现这一点,我存储了所有三元组,然后找到它们的出现,以便按递增顺序分配数字。有没有其他方法可以在 python 中实现相同的功能。实际上我的文件是 500GB,不可能将所有三元组都存储在内存中以查找它们的出现。
【问题讨论】:
-
@JoranBeasley 好的。您能否说明如何使用数据库来做同样的事情......因为我是在 python 中使用数据库的新手
-
第二行如何从
A B C.转换为A B#1 C.? (我猜//cmets 不是输出的一部分?)我没有看到应该使这种情况发生的三个规则中的任何一个。 -
@abamert 是的,你是对的 // 是 cmets。我使用它们是为了说明这一点。
-
如果一切都失败了,使用 64 位版本的 Python 应该可以解决问题。
-
同时,您的文件为 500GB 的事实并不一定意味着这会占用太多内存;这取决于你有多少不同的三元组。那是多少?你确定你没有以其他方式浪费内存(例如,通过
readlines()-在处理之前将整个文件放入内存,或者通过构建一个巨大的列表而不是一次写入一行等)?
标签: python regex linux python-2.7