本版从来没有过小学算术解决不了的问题!

T
TeacherWei
楼主 (未名空间)

牵狗搜C++ csv parser。
第一第二都是github。https://github.com/ben-strasser/fast-cpp-csv-parserhttps://github.com/vincentlaucsb/csv-parser

我相信robustness都没问题。而且各种fancy corner case都帮你搞定了。
第二个连benchmark都给你了69.9 MB in 0.33 seconds.
也就是10G大约47s。1.80GHz i7 + Toshiba XG5 SSD。

讨论:这个应该主要是I/O bound。Toshiba XG5 SSD peak sequential read可以达到2/3GB/s。
如果你用机械HD,估计也就80-100MB/s那个样子。

另外,这个是sequential read,性能和文件大小关系不大。当然,如果是小文件,第
一遍benchmark会比第二次慢很多,因此第二次cache文件到RAM里面了。

不论如何,用上面任何一个库。你一行代码都不写,benchmark一下,应该1分钟左右完成。AGAIN,记住SSD和mechnical HD不一样!

我不明白这么简单的事情,为什么能扯好几天的蛋?
T
TeacherWei

另外,澄清一下误解。
DISK I/O,不论什么介质,SSD或者机械的。都是单线程sequential最快。
你开几十个线程,并行读,肯定更慢。
尤其是机械的。乱seek,并行慢10倍都很容易。

如果你读完了CPU in memory处理很费事,可以考虑一个I/O thread分批读,发送多个
thread处理。这种情况,total threads == CPU cores是最优的。如果你CPU只有4
cores,每个2 hyper thread,那么total == 8 threads。多了的话,没用!
g
guvest

他问的是单线程嘛。单线程的库不好找。io用fread读一块,用庫parse一下,再读再
parse就好。另外csv很trick的,就算用开源库(你找的第二个不错,visual studio也可以用),我肯定要检查Windows 文件,unix
文件EOF EOL之类的东西的。

【 在 TeacherWei(TW) 的大作中提到: 】
<br>: 另外,澄清一下误解。
<br>: DISK I/O,不论什么介质,SSD或者机械的。都是单线程sequential最快。
<br>: 你开几十个线程,并行读,肯定更慢。
<br>: 尤其是机械的。乱seek,并行慢10倍都很容易。
<br>: 如果你读完了CPU in memory处理很费事,可以考虑一个I/O thread分批
读,发
送多个
<br>: thread处理。这种情况,total threads == CPU cores是最优的。如果你CPU只
有4
<br>: cores,每个2 hyper thread,那么total == 8 threads。多了的话,没
用!
<br>

n
netghost

說實話啊,我覺得用了這個也沒用。csv這種東西parse完了是要拿去幹別的事情的,你覺得這麼一件事情搞不明白的,下面的事情能搞明白?
【 在 TeacherWei (TW) 的大作中提到: 】
: 牵狗搜C++ csv parser。
: 第一第二都是github。
: https://github.com/ben-strasser/fast-cpp-csv-parser
: https://github.com/vincentlaucsb/csv-parser
: 我相信robustness都没问题。而且各种fancy corner case都帮你搞定了。
: 第二个连benchmark都给你了69.9 MB in 0.33 seconds.
: 也就是10G大约47s。1.80GHz i7 + Toshiba XG5 SSD。
: 讨论:这个应该主要是I/O bound。Toshiba XG5 SSD peak sequential read可以达
到2
: /3GB/s。
: 如果你用机械HD,估计也就80-100MB/s那个样子。
: ...................

g
guvest

刷题再多,也对写个能用的Windows notepad无帮助。

【 在 netghost(Up to Isomorphism) 的大作中提到: 】
<br>: 說實話啊,我覺得用了這個也沒用。csv這種東西parse完了是要拿去幹別的事情
的,你
<br>: 覺得這麼一件事情搞不明白的,下面的事情能搞明白?
<br>: 到2
<br>

T
TeacherWei

老顾动不动就神秘化。什么EOF EOL之类。
就是Windows和DOS换行用CR+LF,C语言里面是\r\n
MAC OSX和Unix用LF,单个\n。

这些,对CSV没影响,把\r直接滤掉就好。
还有一个老顾没提,估计是不知道呵呵,那就是如果文件是Unicode,比如里面有中文
,在Window里面,文件前三个字节硬塞了EF BB BF三个字符。

这些,我假定都不是大问题。人家连整个RFC就实现了,这些应该都能搞定。否则早有
人报issue了,基本轮不到我们。退一万步讲,即使真的没搞定,改代码也就是几分钟
的事情。

至于单线程多线程,用户call API,单线程等一分钟返回,那就是单线程。里面咋实现的管你啥事?再说了,第一个编译可以强制单线程。
g
goodtudou

不把简单问题复杂化,老顾就不能多打字了

【 在 TeacherWei (TW) 的大作中提到: 】
: 牵狗搜C++ csv parser。
: 第一第二都是github。
: https://github.com/ben-strasser/fast-cpp-csv-parser
: https://github.com/vincentlaucsb/csv-parser
: 我相信robustness都没问题。而且各种fancy corner case都帮你搞定了。
: 第二个连benchmark都给你了69.9 MB in 0.33 seconds.
: 也就是10G大约47s。1.80GHz i7 + Toshiba XG5 SSD。
: 讨论:这个应该主要是I/O bound。Toshiba XG5 SSD peak sequential read可以达
到2
: /3GB/s。
: 如果你用机械HD,估计也就80-100MB/s那个样子。
: ...................

T
TeacherWei

这些问题,包括那个12306,其实解决方案都很boring,就是太简单!
I like simple!
而且都是小学数学就应该能搞定的!
做一个大项目,100%从底层做起,我就是能用别人10%的代码,去实现更多的功能!
大家都是聪明人,主要是越聪明的人,扯蛋越多,利益冲突越难把控!你看看小菊花谈吐多高深?这世界上有他不知道的么?这样的,不用多,混进来一个,项目基本就毁了。而且让你10辈子都找不出毛病在哪里?
T
TeacherWei

Windows Unicode那三个字节叫做Byte Order Mark (BOM)
EF BB BF
我检查了一下,这俩库,还真的都不能处理。
不过,修改一下也就是几分钟。
更何况,用户可能不需要呢?
大概率他的csv是别的软件生成的,根本没这个mark!
微软其实很多无事生非。不说也罢。

这也说明了我这些年一直强调的。只有代码可重用才靠谱。所谓的module可重用基本是扯蛋!还有就是任何其他人的代码,不改基本不好用。
g
guvest

包括你说的这个细节,好多细节我确实不知道。但我知道这个地方有风险。
所以要测试要查的。

csv是人人都能写的文本文件。windows文本文件和unix文本文件好多细节要处理。
end of line那个我记得是这样的,你查查看对不对:
有的windows软件写出来的csv,最后一行会把dash r,dash n里的dash r删掉。
所以古代录入实验数据的时候,csv文件最后一行要按个return是比较稳妥的办法。

另外excel,windows老的notepad写出来的csv也有问题要处理。那些更麻烦。
就不多说。这些东西不是我故意抬扛,有的硬件测试设备带的软件,出来的数据还就
是windows excel csv。

金融口的csv估计另有一对麻烦,我不熟悉就不说了。
【 在 TeacherWei (TW) 的大作中提到: 】
: 老顾动不动就神秘化。什么EOF EOL之类。
: 就是Windows和DOS换行用CR+LF,C语言里面是rn
: MAC OSX和Unix用LF,单个n。
: 这些,对CSV没影响,把r直接滤掉就好。
: 还有一个老顾没提,估计是不知道呵呵,那就是如果文件是Unicode,比如里面有中文
: ,在Window里面,文件前三个字节硬塞了EF BB BF三个字符。
: 这些,我假定都不是大问题。人家连整个RFC就实现了,这些应该都能搞定。否则早有
: 人报issue了,基本轮不到我们。退一万步讲,即使真的没搞定,改代码也就是几分钟
: 的事情。
: 至于单线程多线程,用户call API,单线程等一分钟返回,那就是单线程。里面咋实现
: ...................

g
guvest

你低估这个问题的复杂性了。
先不说csv的问题。文本文件:https://latedev.wordpress.com/2012/12/04/all-about-eof/

这个我扫了一眼,可能还没有写全。
【 在 goodtudou (goodtudou) 的大作中提到: 】
: 不把简单问题复杂化,老顾就不能多打字了
: 到2

g
guvest

小心驶得万年船。
【 在 TeacherWei (TW) 的大作中提到: 】
: Windows Unicode那三个字节叫做Byte Order Mark (BOM)
: EF BB BF
: 我检查了一下,这俩库,还真的都不能处理。
: 不过,修改一下也就是几分钟。
: 更何况,用户可能不需要呢?
: 大概率他的csv是别的软件生成的,根本没这个mark!
: 微软其实很多无事生非。不说也罢。
: 这也说明了我这些年一直强调的。只有代码可重用才靠谱。所谓的module可重用基本是
: 扯蛋!还有就是任何其他人的代码,不改基本不好用。

T
TeacherWei

这个就是几分钟的问题。
我估计楼主就是一次性parse。要是我直接上库。
搜到的两种估计99%都能一次通过。
有问题再说。我估计最大的问题就是哪个windows的BOM。哪个需要改一下代码。也就几行。

总之,就是3-10分钟的事儿。

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: 小心驶得万年船。

n
netghost

小菊花可能會叫你用cdn,什麼東西之類的。
【 在 TeacherWei (TW) 的大作中提到: 】
: 这些问题,包括那个12306,其实解决方案都很boring,就是太简单!
: I like simple!
: 而且都是小学数学就应该能搞定的!
: 做一个大项目,100%从底层做起,我就是能用别人10%的代码,去实现更多的功能!
: 大家都是聪明人,主要是越聪明的人,扯蛋越多,利益冲突越难把控!你看看小菊花谈
: 吐多高深?这世界上有他不知道的么?这样的,不用多,混进来一个,项目基本就毁了
: 。而且让你10辈子都找不出毛病在哪里?

y
yhangw

这个说IO密集魏老师特指原始超慢方案吧。 不然怎么看也是CPU密集。

一是数据进来要parse 二是内核还得里外给
折腾。随便写一下 看看CPU是不是wait比例那么大。系统大块读文件的能力不要小瞧。

T
TeacherWei

这个我考虑也是欠周到。
SSD读速度大约500MB/s。NVME可以2-3GB/s。这个很容易验证。
但是他那个benchmark是1.8GHz笔记本电脑。
6core/12 thread台式机呢?32core/64 thread AMD threadripper呢?

【 在 yhangw (老妖) 的大作中提到: 】
: 这个说IO密集魏老师特指原始超慢方案吧。 不然怎么看也是CPU密集。
: 一是数据进来要parse 二是内核还得里外给
: 折腾。随便写一下 看看CPU是不是wait比例那么大。系统大块读文件的能力不要小瞧。