代码之家  ›  专栏  ›  技术社区  ›  Roel

stxxl超过螺纹圈数OS限值

  •  0
  • Roel  · 技术社区  · 6 年前

    STXXL 1.4.1在Windows 10/VS2015上。

    我有一些代码,我基本上用这个:

    typedef stxxl::vector<RC, 4, stxxl::lru_pager<8>, 2 * 1024> TVector;
    typedef stxxl::deque<RC, TVector> CellIndexList;
    

    这是为了将块大小从默认的2*1024*1024降低;我必须这样做,因为

    std::vector<CellIndexList> list(400);
    

    由于默认的stxxl::vector分配了一个大约60MB的缓冲区,所以我的vector中有60*400MB的缓冲区,这个缓冲区由于错误的分配(32位)而崩溃,所以这就是我现在的设置。

    以此为背景,我现在遇到的问题是,我的代码在执行以下stxxl诊断时崩溃:

    [STXXL-ERRMSG] Exception thrown in ~vector()
    

    当我在stxxl::vector::~vector()中添加一些额外的诊断时,得到以下结果:

    Dynamic exception type: class std::system_error
    std::exception::what: resource unavailable try again: resource unavailable try again
    

    因此,STXXL::vector析构函数中的FrHuffE()失败了,从Google看来,这个异常意味着已经达到了最大线程数。

    现在我很难理解为什么在执行flush()时会创建额外的线程。我查看了stxxl源代码,发现了一些不同类型的磁盘队列,我还尝试在defines.h中启用stxxl戥u HACK戥u SINGLE戥IO戥u线程,但所有这些都只是尝试随机操作,因为我缺乏stxxl创建多少线程的概述,这些线程用于哪些目的,在什么情况下创建。

    我也试过做一个独立的问题来展示这个问题,但是失败了;我很容易做到

    std::vector<CellIndexList> d(10000);
    

    把大量的数据毫无疑问地填满。所以我在实际代码中使用东西的方式一定有一些特殊的地方导致了这个线程问题。它太大了,在我把问题解决之前不能把东西砍掉。

    所以,我的问题是:在stxxl中是否有可能创建大量线程的地方?还有什么我可以试着在这里找到问题的吗?

    0 回复  |  直到 6 年前
    推荐文章