由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 单线程读大文件的代码的设计?
相关主题
Smart Parser/Compiler Development哎,本来想从讨论中学些东西
请教一个parser的问题推荐个html parser的库?
C++ 屏幕输入问题protobuf 能serialize Float.NaN 么?
help on string parse问个SHELL SCIPT的问题
谁知道如何调试yacc程序?请帮忙看一下这个c程序(更新)
[合集] 被perl雷到了,sed, awk, cygwin, native以及其他How to Parsing function in haskell?
王垠对google的看法 (转载)parsing bibliography and sorting (转载)
有没有这样的blind JSON parserPython没有for loop
相关话题的讨论汇总
话题: csv话题: br话题: 文件话题: parse话题: protobuf
进入Programming版参与讨论
1 (共1页)
g****t
发帖数: 31659
1
如果是实战,要把大csv文件读入数组。
我会这样做:
1. 先用fseek ...写一个文件分割器。将其分为n个小文件。
2.用常用的读,parse csv第三方软件,依次读取。
这个办法的目的是:最小化uncertainty。
parse csv不是trivial 的任务。自己写不划算。必须用第三方。
然而第三方csv parse根据个人经验,对大文件的表现是未知的。
中间未必不会出错。所以分成小文件,一个一个读是最可预测结果的办法。
这个设计把大文件处理,和parse文件分成两个任务。也符合divide and
conquer的原则。
大家怎么看?有给予更低的surprise概率办法吗?
我比较倾向于设计阶段想定稳妥的办法,这样写码基本上就是比较单纯的labor。
m******r
发帖数: 1033
2
对我最难的是parse. 各种标点符号,不可见字符,CRLF,逗号引号,正斜杠,反斜杠,
水平制表符,竖直制表符,单引号,双引号,派普,中文,法文,拉丁文,希腊文,阿
拉伯文,带引号的版本,不带引号的版本, 够你喝一壶的。
1.最省力的,如果可能,和生成文件的人员谈好。 特殊字符都删掉,统一分隔符。
2.找实习来做。 实习可以实验不同工具,不同设置。
3.不是所有记录都能读出来。 有时一两个个百分点读不出来,很正常的事。
虽然没编过程 , 读文件各种奇葩的事情见过很多。 年轻时还有因为读文件把IT部门
惹毛了的故事, 以后给你们讲讲。
g****t
发帖数: 31659
3
有经验的数据人员,都知道csv parse最好不要自己做----除非数据来源在你同一个程
序控制之下。这一点要有认知。不然这个活是干不了的。
和数据生成人员谈好,也不是就没问题了。下次换人,或者outsource到印度了,
你还继续谈吗?找实习生来做csv parse也是错误的。一年以后csv parse出错,花1星
期debug,划算吗?

【在 m******r 的大作中提到】
: 对我最难的是parse. 各种标点符号,不可见字符,CRLF,逗号引号,正斜杠,反斜杠,
: 水平制表符,竖直制表符,单引号,双引号,派普,中文,法文,拉丁文,希腊文,阿
: 拉伯文,带引号的版本,不带引号的版本, 够你喝一壶的。
: 1.最省力的,如果可能,和生成文件的人员谈好。 特殊字符都删掉,统一分隔符。
: 2.找实习来做。 实习可以实验不同工具,不同设置。
: 3.不是所有记录都能读出来。 有时一两个个百分点读不出来,很正常的事。
: 虽然没编过程 , 读文件各种奇葩的事情见过很多。 年轻时还有因为读文件把IT部门
: 惹毛了的故事, 以后给你们讲讲。

d******e
发帖数: 2265
4
科班毕业的吗?
你就一个线程。
分个屁啊。
DMA, cache了解一下。
最优是pipeline。
另外,多大csv?
没见过达到还自己写parser的。
back of envelope自己算算知道了。
实在csv 太大,劈成几十个小csv然后逃别人的parser不就得了。
最快实现方法pands直接读入到data frame.
能比pandas快再说吧。

【在 g****t 的大作中提到】
: 如果是实战,要把大csv文件读入数组。
: 我会这样做:
: 1. 先用fseek ...写一个文件分割器。将其分为n个小文件。
: 2.用常用的读,parse csv第三方软件,依次读取。
: 这个办法的目的是:最小化uncertainty。
: parse csv不是trivial 的任务。自己写不划算。必须用第三方。
: 然而第三方csv parse根据个人经验,对大文件的表现是未知的。
: 中间未必不会出错。所以分成小文件,一个一个读是最可预测结果的办法。
: 这个设计把大文件处理,和parse文件分成两个任务。也符合divide and
: conquer的原则。

g****t
发帖数: 31659
5
“实在csv 太大,劈成几十个小csv然后逃别人的parser不就得了。”
你这句话和我说的是一样的。
你再读读我的贴。(我第一步没写清楚,现加入“小文件”三个字)
dma,cache,弄得越复杂,和平台绑定越紧。分割大文件这一步,其实
就是个
random access文件的问题,linux或者windows标准答案就可以。
pandas多数情况下不可取。除非本来就有python的模块,不然
把python的deploy维护弄进来,得不偿失。
以前我用pandas的时候,发现还有不少别的不确定性,就不说了。

【在 d******e 的大作中提到】
: 科班毕业的吗?
: 你就一个线程。
: 分个屁啊。
: DMA, cache了解一下。
: 最优是pipeline。
: 另外,多大csv?
: 没见过达到还自己写parser的。
: back of envelope自己算算知道了。
: 实在csv 太大,劈成几十个小csv然后逃别人的parser不就得了。
: 最快实现方法pands直接读入到data frame.

l*******m
发帖数: 1096
6
数据多而且大,还一定c++. design 直接上protobuf就行了

:如果是实战,要把大csv文件读入数组。
:我会这样做:
g****t
发帖数: 31659
7
我这是有一说一。没学过protobuf。
会用的人,这可能是个捷径。


: 数据多而且大,还一定c . design 直接上protobuf就行了

: :如果是实战,要把大csv文件读入数组。

: :我会这样做:



【在 l*******m 的大作中提到】
: 数据多而且大,还一定c++. design 直接上protobuf就行了
:
: :如果是实战,要把大csv文件读入数组。
: :我会这样做:

C*****l
发帖数: 1
8
csv的痛苦就是有人把乱七八糟的东西往里扔,一个简单的东西搞成垃圾堆。 按照简单
规矩来,谁改坏了谁去fix

【在 g****t 的大作中提到】
: 有经验的数据人员,都知道csv parse最好不要自己做----除非数据来源在你同一个程
: 序控制之下。这一点要有认知。不然这个活是干不了的。
: 和数据生成人员谈好,也不是就没问题了。下次换人,或者outsource到印度了,
: 你还继续谈吗?找实习生来做csv parse也是错误的。一年以后csv parse出错,花1星
: 期debug,划算吗?

n******t
发帖数: 4406
9
这也是乱堆轮子的。protobuf都来了。


: 数据多而且大,还一定c . design 直接上protobuf就行了

: :如果是实战,要把大csv文件读入数组。

: :我会这样做:



【在 l*******m 的大作中提到】
: 数据多而且大,还一定c++. design 直接上protobuf就行了
:
: :如果是实战,要把大csv文件读入数组。
: :我会这样做:

a********c
发帖数: 3657
10

笨。既然是csv,肯定是数据file。那当然是先convert to binary file,比csv快百倍


【在 g****t 的大作中提到】
: 如果是实战,要把大csv文件读入数组。
: 我会这样做:
: 1. 先用fseek ...写一个文件分割器。将其分为n个小文件。
: 2.用常用的读,parse csv第三方软件,依次读取。
: 这个办法的目的是:最小化uncertainty。
: parse csv不是trivial 的任务。自己写不划算。必须用第三方。
: 然而第三方csv parse根据个人经验,对大文件的表现是未知的。
: 中间未必不会出错。所以分成小文件,一个一个读是最可预测结果的办法。
: 这个设计把大文件处理,和parse文件分成两个任务。也符合divide and
: conquer的原则。

相关主题
王垠对google的看法 (转载)推荐个html parser的库?
有没有这样的blind JSON parserprotobuf 能serialize Float.NaN 么?
哎,本来想从讨论中学些东西问个SHELL SCIPT的问题
进入Programming版参与讨论
n******t
发帖数: 4406
11
。。。。。。。。。
这事情就叫parse。

【在 a********c 的大作中提到】
:
: 笨。既然是csv,肯定是数据file。那当然是先convert to binary file,比csv快百倍
: 。

g*******u
发帖数: 3948
12
pandas不行吗。dask不行吗
都不行在自己写呗。
g****t
发帖数: 31659
13
哪个格式最后不是垃圾堆?你从html算起。


: csv的痛苦就是有人把乱七八糟的东西往里扔,一个简单的东西搞成垃圾堆。 按
照简单

: 规矩来,谁改坏了谁去fix



【在 C*****l 的大作中提到】
: csv的痛苦就是有人把乱七八糟的东西往里扔,一个简单的东西搞成垃圾堆。 按照简单
: 规矩来,谁改坏了谁去fix

g****t
发帖数: 31659
14
Python 的deploy问题弄进来没多大意思。一天可用cpp搞好,何必加别的语言。


: pandas不行吗。dask不行吗

: 都不行在自己写呗。



【在 g*******u 的大作中提到】
: pandas不行吗。dask不行吗
: 都不行在自己写呗。

g****t
发帖数: 31659
15
目测本版Qualified 马工数量大幅下降。


: 。。。。。。。。。

: 这事情就叫parse。



【在 n******t 的大作中提到】
: 。。。。。。。。。
: 这事情就叫parse。

g*******u
发帖数: 3948
16
可能你的问题有你的特定用途。我是坚决不写这种东西的。
一定找现成的。我不信我的问题别人没有过。
我也不信你一天写出来的能别别人的强。

【在 g****t 的大作中提到】
: Python 的deploy问题弄进来没多大意思。一天可用cpp搞好,何必加别的语言。
:
:
: pandas不行吗。dask不行吗
:
: 都不行在自己写呗。
:

g****t
发帖数: 31659
17
Pandas速度和性能可靠。但是有别的不确定性。我指的是deploy和今后的维护。
我写的是不是比pandas好,这要看你做项目看重哪方面。
前面一个贴写了,带测试一天搞好c或者cpp。
Cost不算高。c或者cpp写的,只用一个成熟的csv parse作为依赖,加上os给的fseek等
几个函数。deploy和维护当然比python based silution好。
再者,主贴最后一句话比较拗口,仍然请再读一遍:
最小化未来出现surprise 的概率。
按此指标,python之前有个csv的库,也许都比pandas强。
这类软件设计,我的办法就是几个决策树放权重。但要了解软件的几个不同方面的要求
。一个字的“好”或者“不好”,能描述的东西太少了。


: 可能你的问题有你的特定用途。我是坚决不写这种东西的。

: 一定找现成的。我不信我的问题别人没有过。

: 我也不信你一天写出来的能别别人的强。



【在 g*******u 的大作中提到】
: 可能你的问题有你的特定用途。我是坚决不写这种东西的。
: 一定找现成的。我不信我的问题别人没有过。
: 我也不信你一天写出来的能别别人的强。

n******t
发帖数: 4406
18
這又是不會parse一個csv的。

【在 g*******u 的大作中提到】
: 可能你的问题有你的特定用途。我是坚决不写这种东西的。
: 一定找现成的。我不信我的问题别人没有过。
: 我也不信你一天写出来的能别别人的强。

y****w
发帖数: 3747
19
1. (多线程)分段处理是并发的自然选择。考虑效率,按字节操作,需要处理保证读取
完整行且不多读不少读。 用不了几行代码但必须想清楚。 多核,读取解析分开,这
任务严肃起来必须多线程或进程。
2. parse是大问题。 我写过一次某数据库的csv导出文件处理。引号,特殊符号还好,
更坑爹的是允许字串中允许换行。 这对写正则表达式是个挑战。尽可能不要自己写,
多找找现成的库。
3. 如果没什么特殊情况且单机可容忍,考虑用数据库来做。简单粗暴有效方便重复利
用。查询也方便多了。本地sqlite表现都未必差。
y****w
发帖数: 3747
20
一点细节 (在不同线程进程里)分段读取大文件的不同片就行了 千万别真正把文件给
撕开成一堆小文件。这个开销可不小 。
相关主题
请帮忙看一下这个c程序(更新)Python没有for loop
How to Parsing function in haskell?python能检查出space是一个还是两个吗?
parsing bibliography and sorting (转载)问java api的问题
进入Programming版参与讨论
d******c
发帖数: 2407
21
R data.table fread,底层用C写的,久经考验。
Hadley搞了个readr想挑战,最终还是比fread慢一倍。
第一步先把能放进内存的放进内存再说,不要小文件IO。
g*******u
发帖数: 3948
22
如果你本来的东西没有python确实引入新的库很烦人网上应该有现成的吧你稍微改改就
是了吧。你说的大csv文件 到底多大?
多少行记录 多少咧 多大的文件。
太大的csv pandas 也慢啊。

【在 g****t 的大作中提到】
: Pandas速度和性能可靠。但是有别的不确定性。我指的是deploy和今后的维护。
: 我写的是不是比pandas好,这要看你做项目看重哪方面。
: 前面一个贴写了,带测试一天搞好c或者cpp。
: Cost不算高。c或者cpp写的,只用一个成熟的csv parse作为依赖,加上os给的fseek等
: 几个函数。deploy和维护当然比python based silution好。
: 再者,主贴最后一句话比较拗口,仍然请再读一遍:
: 最小化未来出现surprise 的概率。
: 按此指标,python之前有个csv的库,也许都比pandas强。
: 这类软件设计,我的办法就是几个决策树放权重。但要了解软件的几个不同方面的要求
: 。一个字的“好”或者“不好”,能描述的东西太少了。

g****t
发帖数: 31659
23
本帖目的是和大家交流软件设计思路,原则和方法。

【在 g*******u 的大作中提到】
: 如果你本来的东西没有python确实引入新的库很烦人网上应该有现成的吧你稍微改改就
: 是了吧。你说的大csv文件 到底多大?
: 多少行记录 多少咧 多大的文件。
: 太大的csv pandas 也慢啊。

g****t
发帖数: 31659
24
R那个为什么快?优化思路是什么?放内存肯定是基本策略。放多少呢?buffsize怎么
定的?


: R data.table fread,底层用C写的,久经考验。

: Hadley搞了个readr想挑战,最终还是比fread慢一倍。

: 第一步先把能放进内存的放进内存再说,不要小文件IO。



【在 d******c 的大作中提到】
: R data.table fread,底层用C写的,久经考验。
: Hadley搞了个readr想挑战,最终还是比fread慢一倍。
: 第一步先把能放进内存的放进内存再说,不要小文件IO。

n******t
发帖数: 4406
25
不缺內存的情況下這麼搞無可厚非,但是這件事情並不是需要10G內存才能幹好的。
當然有內存的時候,知道先放進去,比很多人來說是個進步了。

【在 d******c 的大作中提到】
: R data.table fread,底层用C写的,久经考验。
: Hadley搞了个readr想挑战,最终还是比fread慢一倍。
: 第一步先把能放进内存的放进内存再说,不要小文件IO。

A**********l
发帖数: 49
26
没看懂你到底担心的是什么,是读取过程出现exception还是数据读错,后者概率很低
如果是critical data担心出错加校验,如果担心格式等parser的exception那先做
clean up然后再读,如果担心文件太大ram可能不够那先做长度检查然后分小块是好办
g****t
发帖数: 31659
27
第一,常见的csv parse tool的performance对大文件是未知的。即使是最简单的csv,
也常用来作为测试语言性能的benchmark 。
第二,自己写csv parse不可行。
既然要用常见的csv parse,又要减少不确定性。那就分成小文件,存起来再用csv
parse在小文件上。这样肯定比较慢。但是最小化了不确定性。


: 没看懂你到底担心的是什么,是读取过程出现exception还是数据读错,后者概
率很低

: 如果是critical data担心出错加校验,如果担心格式等parser的exception那先做

: clean up然后再读,如果担心文件太大ram可能不够那先做长度检查然后分小块
是好办

: 法



【在 A**********l 的大作中提到】
: 没看懂你到底担心的是什么,是读取过程出现exception还是数据读错,后者概率很低
: 如果是critical data担心出错加校验,如果担心格式等parser的exception那先做
: clean up然后再读,如果担心文件太大ram可能不够那先做长度检查然后分小块是好办
: 法

s****r
发帖数: 68
28
要讲性能,就得考虑平台了。
以linux为例,这个任务其实很简单。两个考虑:
1. File io要能readahead,and for memory copy, batch read to application
memory for good memory copy performance.
2. Application level: existing parser to directly parse application memory.
For 2. getline什么的都可以。
For 1. 如果想用流输入输出函数(比如getline)batch read可以用setvbuf()(
https://en.cppreference.com/w/c/io/setvbuf);
readahead,直接call同名的system call就可以(https://man7.org/linux/man-
pages/man2/readahead.2.html)。这个call是异步的,对application的blocking几乎
没有。
当然getline其实就是按换行符分割。csv parser要做的事情比那个多不少。好的设计
要separate concerns(https://en.wikipedia.org/wiki/Separation_of_concerns
。上面的方法把IO性能和parser设计基本分开。写application logic的人可以开发各
种parser而不用再考虑IO的性能。

【在 g****t 的大作中提到】
: 如果是实战,要把大csv文件读入数组。
: 我会这样做:
: 1. 先用fseek ...写一个文件分割器。将其分为n个小文件。
: 2.用常用的读,parse csv第三方软件,依次读取。
: 这个办法的目的是:最小化uncertainty。
: parse csv不是trivial 的任务。自己写不划算。必须用第三方。
: 然而第三方csv parse根据个人经验,对大文件的表现是未知的。
: 中间未必不会出错。所以分成小文件,一个一个读是最可预测结果的办法。
: 这个设计把大文件处理,和parse文件分成两个任务。也符合divide and
: conquer的原则。

a****l
发帖数: 8211
29
分成一堆小文件可能不见得有用,反而可能会更糟糕。如果程序有一堆线程同时读这些
小文件的话,文件又如果是在机械硬盘上的,那恐怕会是很可怕的,运行的好是锯硬盘
,运行的不好直接就报销了硬盘,然后就不需要担心了...

【在 g****t 的大作中提到】
: 如果是实战,要把大csv文件读入数组。
: 我会这样做:
: 1. 先用fseek ...写一个文件分割器。将其分为n个小文件。
: 2.用常用的读,parse csv第三方软件,依次读取。
: 这个办法的目的是:最小化uncertainty。
: parse csv不是trivial 的任务。自己写不划算。必须用第三方。
: 然而第三方csv parse根据个人经验,对大文件的表现是未知的。
: 中间未必不会出错。所以分成小文件,一个一个读是最可预测结果的办法。
: 这个设计把大文件处理,和parse文件分成两个任务。也符合divide and
: conquer的原则。

g*******u
发帖数: 3948
30
感觉1,2个g差不多吧。s3上传普通限制好像是5g左右。

【在 g****t 的大作中提到】
: R那个为什么快?优化思路是什么?放内存肯定是基本策略。放多少呢?buffsize怎么
: 定的?
:
:
: R data.table fread,底层用C写的,久经考验。
:
: Hadley搞了个readr想挑战,最终还是比fread慢一倍。
:
: 第一步先把能放进内存的放进内存再说,不要小文件IO。
:

相关主题
parsing file in node: js or python ?请教一个parser的问题
读取数据求教C++ 屏幕输入问题
Smart Parser/Compiler Developmenthelp on string parse
进入Programming版参与讨论
g****t
发帖数: 31659
31
能妥善处理1G的库非常多,这被我的假设。
当然不能分成20k的文件。


: 分成一堆小文件可能不见得有用,反而可能会更糟糕。如果程序有一堆线程同时
读这些

: 小文件的话,文件又如果是在机械硬盘上的,那恐怕会是很可怕的,运行的好是
锯硬盘

: ,运行的不好直接就报销了硬盘,然后就不需要担心了...



【在 a****l 的大作中提到】
: 分成一堆小文件可能不见得有用,反而可能会更糟糕。如果程序有一堆线程同时读这些
: 小文件的话,文件又如果是在机械硬盘上的,那恐怕会是很可怕的,运行的好是锯硬盘
: ,运行的不好直接就报销了硬盘,然后就不需要担心了...

g****t
发帖数: 31659
32
c标准库应该比cpp库快,对环境依赖也更少,这个假设对不对?


: 要讲性能,就得考虑平台了。

: 以linux为例,这个任务其实很简单。两个考虑:

: 1. File io要能readahead,and for memory copy, batch read to
application

: memory for good memory copy performance.

: 2. Application level: existing parser to directly parse application
memory.

: For 2. getline什么的都可以。

: For 1. 如果想用流输入输出函数(比如getline)batch read可以用setvbuf(
)(

: https://en.cppreference.com/w/c/io/setvbuf);

: readahead,直接call同名的system call就可以(https://man7.org/linux/
man-

: pages/man2/readahead.2.html)。这个call是异步的,对application的
blocking几乎



【在 s****r 的大作中提到】
: 要讲性能,就得考虑平台了。
: 以linux为例,这个任务其实很简单。两个考虑:
: 1. File io要能readahead,and for memory copy, batch read to application
: memory for good memory copy performance.
: 2. Application level: existing parser to directly parse application memory.
: For 2. getline什么的都可以。
: For 1. 如果想用流输入输出函数(比如getline)batch read可以用setvbuf()(
: https://en.cppreference.com/w/c/io/setvbuf);
: readahead,直接call同名的system call就可以(https://man7.org/linux/man-
: pages/man2/readahead.2.html)。这个call是异步的,对application的blocking几乎

l*******m
发帖数: 1096
33
我的确是从非技术角度讲。protobuf的最大好处是选择了格式就定了实现。json也不错
,有几个过硬的实现。csv最乱了。
码工不能化大部分时间吵架。要做一系列决定是要命的,最好做一个bundle的决定

:我这是有一说一。没学过protobuf。
:会用的人,这可能是个捷径。
g****t
发帖数: 31659
34
谢谢推荐。今晚学一下protobuf,也许可以引入使用。
csv好处是人人都觉得自己懂。坏处也是如此。
前面有个id说当年写csv parser,他搞了一个月。


: 我的确是从非技术角度讲。protobuf的最大好处是选择了格式就定了实现
。json
也不错

: ,有几个过硬的实现。csv最乱了。

: 码工不能化大部分时间吵架。要做一系列决定是要命的,最好做一个
bundle的决定

: :我这是有一说一。没学过protobuf。

: :会用的人,这可能是个捷径。



【在 l*******m 的大作中提到】
: 我的确是从非技术角度讲。protobuf的最大好处是选择了格式就定了实现。json也不错
: ,有几个过硬的实现。csv最乱了。
: 码工不能化大部分时间吵架。要做一系列决定是要命的,最好做一个bundle的决定
:
: :我这是有一说一。没学过protobuf。
: :会用的人,这可能是个捷径。

b*******s
发帖数: 5216
35
mmap then remap
h****e
发帖数: 2125
36
把csv变成binary file不是serialize加save吗?

【在 g****t 的大作中提到】
: 目测本版Qualified 马工数量大幅下降。
:
:
: 。。。。。。。。。
:
: 这事情就叫parse。
:

g****t
发帖数: 31659
37
csv是带格式纯文本文件。0的数据是48 (ascii). 变成数组然后序列化什么的,再存储
是可以
的。

【在 h****e 的大作中提到】
: 把csv变成binary file不是serialize加save吗?
l****r
发帖数: 119
38
按行存储不如按列存储快
存字符不如存成二进制
csv 按行,字符
protobuf 按行,二进制
parquet 按列,二进制
1 (共1页)
进入Programming版参与讨论
相关主题
python能检查出space是一个还是两个吗?谁知道如何调试yacc程序?
问java api的问题[合集] 被perl雷到了,sed, awk, cygwin, native以及其他
parsing file in node: js or python ?王垠对google的看法 (转载)
读取数据求教有没有这样的blind JSON parser
Smart Parser/Compiler Development哎,本来想从讨论中学些东西
请教一个parser的问题推荐个html parser的库?
C++ 屏幕输入问题protobuf 能serialize Float.NaN 么?
help on string parse问个SHELL SCIPT的问题
相关话题的讨论汇总
话题: csv话题: br话题: 文件话题: parse话题: protobuf