使用 clojure 处理大数据量文本

139 views
Skip to first unread message

Joshua Jin

unread,
Feb 3, 2015, 9:26:44 AM2/3/15
to cn-cl...@googlegroups.com

Hi 各位, 


项目中需要处理一个大约 24G 的文件,对每一行文本进行解析并执行一些计算逻辑,最后写入数据库。 

我打算用 clojure 来完成这个功能,基本思路是使用 line-seq -> partition -> pmap ,文本拆分成几个部分,利用 clojure 并行的功能同时处理,然后写入数据库,不知道各位有没有类似的经验,或是觉得这种方案是否合理,这种应用场景使用 clojure 是否合适? 


Best Regards 

Joshua Jin

Robert Luo

unread,
Feb 3, 2015, 9:06:48 PM2/3/15
to cn-cl...@googlegroups.com
这个场景下用上述思路应该是可以的,但其并行能力可能非常有限。因为 io 没有并行,如果计算任务繁重,pmap 所能带来的并行能力可能也不够。

可以考虑: 
  1. reducers + iota iota 提供比 line-seq 好得多的 io reduce 能力, clojure.reducer 使用 JRE 1.7 的 fork/join 库,从原理上应该比 partition/pmap 效率高。
  2. tesser 据称是专门处理这个场景。

Xiaojun Weng

unread,
Feb 3, 2015, 9:29:53 PM2/3/15
to cn-cl...@googlegroups.com

试试dorun

(defn read-big-file [func, filename]

 (with-open [rdr (io/reader filename)]

   (dorun (map func (line-seq rdr)))))




在 2015年2月3日星期二 UTC+8下午10:26:44,Joshua Jin写道:

Peter Wu

unread,
Feb 3, 2015, 10:11:57 PM2/3/15
to cn-cl...@googlegroups.com
感觉用 line-seq -> partition -> pmap没多大用,首先IO这个瓶颈就过不去,就别提后面的并行还是并发处理了。所以不说什么语言了,我的实现思路是。
1、因为IO是瓶颈,所以文件先分块。
2、并行抽取分块的文件内容到一个缓冲区。
3、去这个缓冲区消费数据。


--
中文社区博客:http://blog.clojure.cn/
中文问答网站:http://ask.clojure.cn/
中文邮件列表:https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
---
您收到此邮件是因为您订阅了Google网上论坛上的“CN-Clojure”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到cn-clojure+...@googlegroups.com
要发帖到此群组,请发送电子邮件至cn-cl...@googlegroups.com
访问此群组:http://groups.google.com/group/cn-clojure
要查看更多选项,请访问https://groups.google.com/d/optout

dennis zhuang

unread,
Feb 3, 2015, 10:13:20 PM2/3/15
to cn-cl...@googlegroups.com
iota 是用 mmap,但是 java 的 MappedByteBuffer 还是有 1G 的限制,24G文件应该无能为力,可以先拆分文件。

reducers 的  fold 比 pmap 更合适这个场景。

在 2015年2月4日 上午10:29,Xiaojun Weng <wengxia...@gmail.com>写道:

--
中文社区博客:http://blog.clojure.cn/
中文问答网站:http://ask.clojure.cn/
中文邮件列表:https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
---
您收到此邮件是因为您订阅了Google网上论坛上的“CN-Clojure”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到cn-clojure+...@googlegroups.com
要发帖到此群组,请发送电子邮件至cn-cl...@googlegroups.com
访问此群组:http://groups.google.com/group/cn-clojure
要查看更多选项,请访问https://groups.google.com/d/optout



--
庄晓丹
Email:        killm...@gmail.com xzh...@avos.com
Site:           http://fnil.net
Twitter:      @killme2008


Yunfan Jiang

unread,
Feb 4, 2015, 2:14:34 AM2/4/15
to cn-cl...@googlegroups.com
哈 我的工作有80%是干这个 也刚好是20多G的文件 暂时是用python 不过我也曾经试过用clojure 发现用clojure的正则会快不少

从实际经验来看 系统提供的分行是会很降低性能的 最好先切块 单独处理  不要一行一行来

--
中文社区博客:http://blog.clojure.cn/
中文问答网站:http://ask.clojure.cn/
中文邮件列表:https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
---
您收到此邮件是因为您订阅了Google网上论坛上的“CN-Clojure”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到cn-clojure+...@googlegroups.com
要发帖到此群组,请发送电子邮件至cn-cl...@googlegroups.com
访问此群组:http://groups.google.com/group/cn-clojure
要查看更多选项,请访问https://groups.google.com/d/optout



--
Name: yunfan
Site: http://geek42.info/
Interest:
  - Lang: [forth, clojure, c, python, lua]
  - software: [nginx, redis]
  - abstract: [vm, tiny, cloud, html5]
  - history
  - science-fiction
  - music: [new-age, vangelis, yanni]

烨辰陆

unread,
Feb 5, 2015, 2:04:55 AM2/5/15
to cn-cl...@googlegroups.com

分分文件大小。。用perl吧。。。

Joshua Jin

unread,
Feb 5, 2015, 5:41:04 AM2/5/15
to cn-cl...@googlegroups.com
非常感谢大家的热情解答和相关建议,我会逐一尝试,等有了较为具体的结果会把相关数据发出来供大家参考!

在 2015年2月3日 下午10:26,Joshua Jin <zhongh...@gmail.com>写道:

Yusup Devl

unread,
Apr 1, 2015, 10:10:19 AM4/1/15
to cn-cl...@googlegroups.com
可以尝试写transducer ,可以提高性能
Reply all
Reply to author
Forward
0 new messages