浏览 3306 次
锁定老帖子 主题:lists模块中delete函数的调优
精华帖 (0) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-01-31
Erlang中删除列表元素在标准模块lists中可以找到delete/2函数, 比如调用lists:delete(2, [1,2,3,4,5])后将返回新的列表[1,3,4,5] %% reverse(L) reverse all elements in the list L. Is now a BIF! 由此确定reverse是一个BIF。 delete(Item, [Item|Rest]) -> Rest; delete(Item, [H|Rest]) -> [H|delete(Item, Rest)]; delete(_, []) -> [].
这个实现没使用尾递归,对大表的操作将会导致堆栈上的内存消耗严重。 test1() -> {ok,Bin} = file:read_file("file1.txt"), L = binary_to_list(Bin), R = lists:delete($a,L), io:format("~p~n",[length(R)]).
文件file1.txt有近30M大小,运行时内存高值1G以上。 delete(E, [E|T], R) -> lists:reverse(R) ++ T; delete(E, [H|T], R) -> delete(E, T, [H|R]); delete(E, [], R) -> lists:reverse(R).
再运行测试程序: test2() -> {ok,Bin} = file:read_file("file1.txt"), L = binary_to_list(Bin), R = delete($a,L,[]), io:format("~p~n",[length(R)]). 发现内存占用在800M以内。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-02-01
我认为,如果需求中存在需要随机访问的庞大线性表,那么用List本身就是一个糟糕的注意.
|
|
返回顶楼 | |
发表时间:2008-02-01
Trustno1 写道 我认为,如果需求中存在需要随机访问的庞大线性表,那么用List本身就是一个糟糕的注意.
delete 不使用尾递归写那是在教育你,就像 Haskell 的 Prelude 库没有几个函数是用尾递归写法的。 教育你 1. 理解函数式编程中有趣的数学归纳法注明的方法;2. 长效需求就用长效数据结构,例如用二叉树实现的 Array。 |
|
返回顶楼 | |
发表时间:2008-02-01
lichray 写道 Trustno1 写道 我认为,如果需求中存在需要随机访问的庞大线性表,那么用List本身就是一个糟糕的注意.
delete 不使用尾递归写那是在教育你,就像 Haskell 的 Prelude 库没有几个函数是用尾递归写法的。 教育你 1. 理解函数式编程中有趣的数学归纳法注明的方法;2. 长效需求就用长效数据结构,例如用二叉树实现的 Array。 我觉得倒是因为够用就好. |
|
返回顶楼 | |
发表时间:2008-02-01
小量数据可以用list 大量的就用set 或者dict之类的专门数据结构 不需要调优的 在这点上。
|
|
返回顶楼 | |
发表时间:2008-02-03
出一个题目:假设需要对一个文件中的某个字进行删除,这个文件可能很大,这时用set,dict是用不上了。list将会是有效的存储方案,涉及对list的操作将不可避免,操作效率也会是很重要的。
|
|
返回顶楼 | |
发表时间:2008-02-03
stworthy 写道 出一个题目:假设需要对一个文件中的某个字进行删除,这个文件可能很大,这时用set,dict是用不上了。list将会是有效的存储方案,涉及对list的操作将不可避免,操作效率也会是很重要的。
请用binary/bitstring(only or r12) |
|
返回顶楼 | |
发表时间:2008-10-13
Trustno1 写道 stworthy 写道 出一个题目:假设需要对一个文件中的某个字进行删除,这个文件可能很大,这时用set,dict是用不上了。list将会是有效的存储方案,涉及对list的操作将不可避免,操作效率也会是很重要的。
请用binary/bitstring(only or r12) binary/bitstring如何用?谢谢! |
|
返回顶楼 | |