C语言中逐列读取矩阵文件并实时供给并行乘法计算的实现方法
无需预读完整文件的矩阵逐列读取方案及替代思路
一、无需全量读取的逐列读取实现方法
由于文本矩阵通常按行存储,要实现不预读全文件的逐列读取,核心是通过记录行偏移量实现随机访问:
- 快速扫描文件元信息:
- 遍历第二个矩阵文件一次,仅记录每行的起始字节偏移(存入数组
row_offsets),同时统计总行数和列数(第一行按分隔符分割后的元素数即为列数)。此过程仅处理换行符,内存开销极低。
- 遍历第二个矩阵文件一次,仅记录每行的起始字节偏移(存入数组
- 按需读取目标列:
- 要读取第
k列时,遍历row_offsets数组,用文件随机定位API(如C的fseek、Python的file.seek())跳转到每行起始位置,读取该行内容至换行符,按分隔符分割后取第k个元素。 - 优化:若内存允许,可同步记录每行内各元素的起始偏移,跳转到行开头后直接定位到目标列元素的起始位置,避免分割整行,提升读取效率。
- 要读取第
二、替代方案(满足p2无需等待全量读取即可计算)
如果逐列读取的实现复杂度较高,可考虑以下更易落地的思路:
- 分块矩阵乘法:
将两个矩阵划分为大小合适的子块(如b×b的方块),p1并行读取A的行块和B的列块,每读好一组对应块就传递给p2计算子块乘积,最终合并所有子块结果。轮转调度下,p2可在p1读完第一组块后立即启动计算,无需等待全量数据。 - 边读边转置(适用于行数较少的B矩阵):
p1启动线程读取B矩阵的每行数据,同时将元素实时写入转置矩阵的对应列(转置矩阵按行存储)。转置后的矩阵可直接按行读取,p2无需等待B全量读取完成,只要转置出部分列即可与A的对应行块开展计算。 - 异步队列缓冲+流式计算:
p1用两个线程分别读取A的行和B的行,将数据存入两个异步队列。p2从队列中拉取数据,当积累足够计算单元(如A的一行和B的所有行可计算结果的一行,或A的行块+B的列块可计算子矩阵)时立即启动计算,通过队列平衡读写速度,避免p2空等。
内容的提问来源于stack exchange,提问作者sahil_p78
相关产品推荐
相关产品推荐

