G****o 发帖数: 167 | 1 本青半路出家搞计算,不是很懂算法。
我现在有一个非并行程序,利用10号设备读取某大文件10.txt,同时用11号设备写文件
x1/11.txt。
现在想同时跑10000个程序。这时就会出现io瓶颈问题。
将军们有无好的建议?谢谢! |
G****o 发帖数: 167 | 2 关于读文件的话,我想的方案是不用设备号打开这个文件,而是先把文件写入内存,然
后程序直接读取根据内存地址读。 |
G****o 发帖数: 167 | |
g***n 发帖数: 14250 | 4 你如果内存够用当然是放内存里再一遍写回文件,io 负担最轻。当然如果你每次批量
写几 MB 也不会怎么样。琐碎的小数据量写入效率最差去。 |
y********4 发帖数: 1116 | |
c*********9 发帖数: 229 | 6 想起当年写汇编的时候,为了速度,把一个字节分8个比特用,
现在的程序员都没有学过计算机结构,没有用过汇编,这是
幸福,还是堕落.....
【在 G****o 的大作中提到】 : 关于读文件的话,我想的方案是不用设备号打开这个文件,而是先把文件写入内存,然 : 后程序直接读取根据内存地址读。
|
G****o 发帖数: 167 | 7 谢谢。
我的10.txt实际是某个格式的binary文件,需要一次性读完,大小是大概2.5GB。1万个
同时提交的jobs都同时读取这个,然后经过一系列计算,写到每个job对应的文件夹下
。实际内存大小是120GB。
所以,其实我每次可能只能同时跑20个。。。同时跑1万个肯定挂掉,我之前吹牛了。
。。,虽然我最后需要跑100万个。
: 你如果内存够用当然是放内存里再一遍写回文件,io 负担最轻。当然如果你每
次批量
: 写几 MB 也不会怎么样。琐碎的小数据量写入效率最差去。
【在 g***n 的大作中提到】 : 你如果内存够用当然是放内存里再一遍写回文件,io 负担最轻。当然如果你每次批量 : 写几 MB 也不会怎么样。琐碎的小数据量写入效率最差去。
|
g***n 发帖数: 14250 | 8 如果文件是只读的数据,那就是楼上说的 memory map,
去查哪个系统库函数是干这事的,内存里放一份,所有job 都能读到 |
G****o 发帖数: 167 | 9 本青还是学过汇编的,都是现在不缺一个GB的内存
: 想起当年写汇编的时候,为了速度,把一个字节分8个比特用,
: 现在的程序员都没有学过计算机结构,没有用过汇编,这是
: 幸福,还是堕落.....
【在 c*********9 的大作中提到】 : 想起当年写汇编的时候,为了速度,把一个字节分8个比特用, : 现在的程序员都没有学过计算机结构,没有用过汇编,这是 : 幸福,还是堕落.....
|
G****o 发帖数: 167 | 10 好的,谢谢
我去研究下
: 如果文件是只读的数据,那就是楼上说的 memory map,
: 去查哪个系统库函数是干这事的,内存里放一份,所有job 都能读到
【在 g***n 的大作中提到】 : 如果文件是只读的数据,那就是楼上说的 memory map, : 去查哪个系统库函数是干这事的,内存里放一份,所有job 都能读到
|
|
|
c*********9 发帖数: 229 | 11 you still dont get it....
【在 G****o 的大作中提到】 : 本青还是学过汇编的,都是现在不缺一个GB的内存 : : : 想起当年写汇编的时候,为了速度,把一个字节分8个比特用, : : 现在的程序员都没有学过计算机结构,没有用过汇编,这是 : : 幸福,还是堕落..... :
|
B********u 发帖数: 1 | |
G****o 发帖数: 167 | 13 这是什么?
我去查查
: redis?
【在 B********u 的大作中提到】 : redis?
|
G****o 发帖数: 167 | 14 哈哈。
本来计算机的发展就是要降低入门门槛的,这样看门大妈都能编程。
: you still dont get it....
【在 c*********9 的大作中提到】 : you still dont get it....
|
t******x 发帖数: 55 | 15 操作系统经常读取的文件有缓存的,除非是特别大的文件
并发io慢是硬盘的问题,硬盘有io指标的,小文件,比如4K每秒能执行多少io指令
如果是普通硬盘,要换成SSD |
G****o 发帖数: 167 | 16 我甚至想读取这个文件后经一个小程序处理,存在几个数组中,这个程序结束后不释放
内存,而是等着后续100万个jobs直接将变量指向这几个数组。
我这用的老板几十年前写的老fortran程序。真恨不得自己重新写一遍,奈何太复杂,
自己能力不够,收益也不大。
: 如果文件是只读的数据,那就是楼上说的 memory map,
: 去查哪个系统库函数是干这事的,内存里放一份,所有job 都能读到
【在 g***n 的大作中提到】 : 如果文件是只读的数据,那就是楼上说的 memory map, : 去查哪个系统库函数是干这事的,内存里放一份,所有job 都能读到
|
G****o 发帖数: 167 | 17 嗯,在考虑让老板买。。。
: 操作系统经常读取的文件有缓存的,除非是特别大的文件
: 并发io慢是硬盘的问题,硬盘有io指标的,小文件,比如4K每秒能执行多少io指令
: 如果是普通硬盘,要换成SSD
【在 t******x 的大作中提到】 : 操作系统经常读取的文件有缓存的,除非是特别大的文件 : 并发io慢是硬盘的问题,硬盘有io指标的,小文件,比如4K每秒能执行多少io指令 : 如果是普通硬盘,要换成SSD
|
G****o 发帖数: 167 | 18 几个GB不知算大还是小
: 操作系统经常读取的文件有缓存的,除非是特别大的文件
: 并发io慢是硬盘的问题,硬盘有io指标的,小文件,比如4K每秒能执行多少io指令
: 如果是普通硬盘,要换成SSD
【在 t******x 的大作中提到】 : 操作系统经常读取的文件有缓存的,除非是特别大的文件 : 并发io慢是硬盘的问题,硬盘有io指标的,小文件,比如4K每秒能执行多少io指令 : 如果是普通硬盘,要换成SSD
|
t******x 发帖数: 55 | 19 大,你很难缓存,自己的缓存不如操作系统文件缓存算法效率高
指令
【在 G****o 的大作中提到】 : 几个GB不知算大还是小 : : : 操作系统经常读取的文件有缓存的,除非是特别大的文件 : : 并发io慢是硬盘的问题,硬盘有io指标的,小文件,比如4K每秒能执行多少io指令 : : 如果是普通硬盘,要换成SSD :
|
t******x 发帖数: 55 | 20 如果是单个几个G文件,可以弄个ram disk
如果太多,总量超过系统内存一半,还是换硬盘吧 |
|
|
G****o 发帖数: 167 | 21 基本就一个3gb的和一个1gb的文件。
: 如果是单个几个G文件,可以弄个ram disk
: 如果太多,总量超过系统内存一半,还是换硬盘吧
【在 t******x 的大作中提到】 : 如果是单个几个G文件,可以弄个ram disk : 如果太多,总量超过系统内存一半,还是换硬盘吧
|
t******x 发帖数: 55 | 22 弄个Ram Disk,网上搜搜怎么弄
【在 G****o 的大作中提到】 : 基本就一个3gb的和一个1gb的文件。 : : : 如果是单个几个G文件,可以弄个ram disk : : 如果太多,总量超过系统内存一半,还是换硬盘吧 :
|
G****o 发帖数: 167 | 23 好的,谢谢
我去看看,有问题再问您
: 弄个Ram Disk,网上搜搜怎么弄
【在 t******x 的大作中提到】 : 弄个Ram Disk,网上搜搜怎么弄
|
g***n 发帖数: 14250 | 24 都什么年代了还 ram disk。
OS memory map 都给你弄好了只放一份在内存里
【在 t******x 的大作中提到】 : 弄个Ram Disk,网上搜搜怎么弄
|
g***n 发帖数: 14250 | 25 内存里没法让别的job 读
你写到一个中间文件,然后 memory map 了,就能直接读了。
不过你 fortran job 要读 memory map 也需要研究一下有没有库函数支持
【在 G****o 的大作中提到】 : 我甚至想读取这个文件后经一个小程序处理,存在几个数组中,这个程序结束后不释放 : 内存,而是等着后续100万个jobs直接将变量指向这几个数组。 : 我这用的老板几十年前写的老fortran程序。真恨不得自己重新写一遍,奈何太复杂, : 自己能力不够,收益也不大。 : : : 如果文件是只读的数据,那就是楼上说的 memory map, : : 去查哪个系统库函数是干这事的,内存里放一份,所有job 都能读到 :
|
t******x 发帖数: 55 | 26 OS memory map麻烦死了
ramdisk简单有效提高文件io
【在 g***n 的大作中提到】 : 都什么年代了还 ram disk。 : OS memory map 都给你弄好了只放一份在内存里
|
g***n 发帖数: 14250 | 27 你每个job读一份到内存里那就是要额外用一个文件那么大的内存,
10000 个job 的话。。。
【在 t******x 的大作中提到】 : OS memory map麻烦死了 : ramdisk简单有效提高文件io
|
t******x 发帖数: 55 | 28 他那个是10000个job对一个文件随机读取的问题吧
他没说清楚。
磁头硬盘随机读取能力很差,如果10000个job都要随机读取,磁头要来回巡道,慢的很。
用RAMdisk就能简单解决,当然用mmap写程序也可以,但是很难写这种程序
【在 g***n 的大作中提到】 : 你每个job读一份到内存里那就是要额外用一个文件那么大的内存, : 10000 个job 的话。。。
|
g***n 发帖数: 14250 | 29 memory map 是系统库函数,直接 C/C++ 当数组用就行了,哪里要写什么程序。
不过 fortran 就不知道了
很。
【在 t******x 的大作中提到】 : 他那个是10000个job对一个文件随机读取的问题吧 : 他没说清楚。 : 磁头硬盘随机读取能力很差,如果10000个job都要随机读取,磁头要来回巡道,慢的很。 : 用RAMdisk就能简单解决,当然用mmap写程序也可以,但是很难写这种程序
|