均匀切片向量的算法

时间:2013-12-27 20:24:35

标签: c++ algorithm vector

假设我正在读一个大小为11520000+等的文件。我需要处理这个文件。显然,在它自己处理整个文件将是内存密集型,并不是很实用。但文件大小会发生变化,但似乎都非常大。

我只是想知道是否存在将矢量划分为均匀大小的块的通用算法?

例如:

如果块大小为8,那么我们可以将块分成4个段,每个段包含2个值:

0 1 0 1 
1 0 1 0

然后会导致:

Seg1:
0 1 
Seg2:
1 0 
Seg3
0 1
Seg4
1 0

非常感谢任何想法

编辑:

该文件是.wav文件,包含双精度值。

1 个答案:

答案 0 :(得分:1)

  1. 确定原始数据大小和格式

    • 正如你所写,你已经知道格式是立体声双打(二进制)
    • 大小可以通过寻找RAW数据文件的结尾来获得
    • 在32位操作系统上注意2GB边界
  2. 读取缓冲区大小取决于您要对数据执行的操作

    • 我假设非实时播放
    • 使用一些过滤器(如降噪,暂停删除......)
    • 所以你很可能需要一些以前的,有时甚至是下一个样本
    • 对于大文件我使用的缓冲区大小从8KB到16MB
    • 在MCU平台上,尺寸通常从32B到2KB
    • 你必须从上面的间隔尝试几个尺寸(使用#define或const)
    • 并选择速度和内存消耗之间的最佳折衷
    • 大多数处理算法性能在某个大小值上饱和,之后不会随着大小而增加
  3. 读取循环

    • 对我来说最好的方法是从主线程(仅单线程)读取RAW数据文件
    • 并且数据均匀地供给处理线程
    • 线程数通常是CPU数
    • 不要忘记共享锁
    • 并且所有线程都应该有自己的缓冲区
  4. 现在读取算法:

    1. 分配/启动线程缓冲区......
    2. 文件从开始寻求0

      • 设置主索引变量,int ix = 0;
    3. 找到第一个带有空缓冲区的线程
    4. 主线的锁定线程/缓冲区
      • 将其实际索引设置为main ix
      • 增加主ix,ix ++;
    5. 如果需要处理,最后将样本复制到缓冲区
    6. 如果还没有复制安全样本值(例如0)
    7. 从RAW文件中读取剩余的缓冲区
    8. 复制安全值,如果文件结尾填充缓冲区......
    9. 从主线程解锁线程/缓冲区
    10. 如果不是文件结尾goto 3
    11. 那么处理后的数据怎么样:

      • 如果你只把它放在记忆中,那么这不是什么大不了的事。
      • 如果再次将其存储到文件中,则还需要编写写算法
      • 1循环ix从0到...
      • 2等待具有相同ix的线程
      • 3将其锁定以进行写入
      • 4将输出数据写入文件
      • 5将线程设置为空(准备好新数据)
      • 6解锁。
      • PS在最后一次写入时,您可以切断未使用的数据以匹配原始文件大小

      PS。

      • 读取也可以通过将整个文件划分为N个块来完成,其中N是线程数,但是需要一些处理来合并输出数据,而读取是自相矛盾的,所以它更慢......
      • 你也可以等待所有的处理线程完成并一次写下它们(有时它更快,有时更慢......取决于处理)

      很抱歉代码缺失,但它依赖于所有平台/环境,你没有指定任何代码,所以我希望无论如何都有帮助......