怎样在 C++里用 C-style 按行读取文件并不分配 heap 内存?

2022-09-14 13:09:01 +08:00
 dangyuluo

同事的破要求,按行读取一个文件,不让用 ifstream ,仅仅是因为“We don't have a precise understanding of how much memory the program will allocate”。想用getline但是getline也会分配内存。请问有没有什么现成的轮子?谢谢。

2441 次点击
所在节点    C++
25 条回复
clrss
2022-09-14 13:32:22 +08:00
C++不也能 scanf?
Jirajine
2022-09-14 14:14:31 +08:00
那就用 read 手写?自己在栈上静态分配 buf ,读到 buf 里自己按换行符拆分。
yolee599
2022-09-14 14:30:00 +08:00
fgets 不行吗?
hankai17
2022-09-14 16:07:19 +08:00
fread ?
newmlp
2022-09-14 16:12:28 +08:00
mmap
lakehylia
2022-09-14 16:20:15 +08:00
按行读取,必然涉及到不定长度的数组啊,你不在 heap 上建数组,难道在栈上?你栈能有多大啊。。。
ysc3839
2022-09-14 17:53:27 +08:00
直接 mmap 吧
nightwitch
2022-09-14 18:18:54 +08:00
按行读取
不用堆
来个 100M 的单行文件必定栈溢出
GeruzoniAnsasu
2022-09-14 18:21:43 +08:00
看描述怎么感觉 ABproblem

你 precisely alloc 一块 heap 来做 buffer 不行么
iyeatse
2022-09-14 18:23:11 +08:00
你可以跑个 benchmark ,给他一个 precise understanding
haolongsun
2022-09-14 19:18:34 +08:00
不知道 size 有多大?还敢在栈上存?
cnbatch
2022-09-14 20:46:35 +08:00
可以反问你的同事一句:那你能精确知道文件的每一行有多长吗?你能保证文件每一行不会超出预分配的固定大小?
重点在于“你能保证吗?”
言外之意就是:“出了事你负责”。
cnbatch
2022-09-14 20:48:32 +08:00
如果你的同事被要求“出了事你负责”还不怂的话,那就正好,把相关保证言论保存下来(最好能放到 Git 记录里面),一旦栈溢出就甩锅给他
chenzhongxiang
2022-09-14 21:03:58 +08:00
我的实践是可以用 mmap ,逐个字符扫描检查换行,不过不允许分配堆内存你拿到了一段比较长的行(例如 1MB ,这个问题的关键就是你压根就不知道一行会有多长)你后续的使用也会有诸多棘手的地方。
更好的实践是不用过多纠结分配堆内存,C 程序员通常应该清楚自己在做什么,合理的分配堆没有任何问题。有一段时间我也尽量避免使用堆内存,错误的以为这样可以提升性能。后来逐渐的意识到没啥必要,你看看 glibc 的源码很多你认为很简单的函数都使用堆内存。你们的项目质量要求比 glibc 还高么。
个人的常规见解。实际项目可能在某个点就是要求苛刻,那就需要妥善的考虑全局。
sockpuppet9527
2022-09-14 21:19:23 +08:00
建议离职,能提出这种不合理的需求的公司可太行了,另外即使是 heap 分内存,也通过类似代理的方式统计。
mingl0280
2022-09-14 21:39:07 +08:00
这个需求太傻 x 了,这么搞肯定栈溢出(正常的栈空间才 8M ),太蠢了……
除非你按定长字节读取(当然这个效率也不行)
zengmingyang96
2022-09-14 21:51:05 +08:00
@mingl0280 编译器指定的,想多大就多大
villivateur
2022-09-14 21:56:20 +08:00
不用 heap 的话,要不在 ZI 区域先定义 1 个 G 的全局变量吧(狗头)
dangyuluo
2022-09-15 02:10:13 +08:00
@sockpuppet9527 我也想走的,但是给的钱太多了。。。
mingl0280
2022-09-15 04:44:55 +08:00
@zengmingyang96 然后你的进程一创建就被系统 ulimit 给嘎了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/879945

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX