我讀三個大的二進制文件(每個c.180Mb)到一個std ::向量如下時:壞分配錯誤填充的std ::矢量
m_ifStream.open("myfile.dat", std::ios::binary | std::ios::in);
if (m_ifStream)
{
//Obtain input stream length
m_ifStream.seekg (0, ios::end);
streamLength = (size_t)(m_ifStream.tellg());
m_ifStream.seekg (0, ios::beg);
//Reserve doesn't work around the problem, may be more efficient though...
//m_buffer = new vector<unsigned char>();
//m_buffer->reserve(streamLength);
//Next line sometimes results in bad_alloc when reading a large file
m_buffer = new vector<unsigned char>((std::istreambuf_iterator<char>(m_ifStream)), (std::istreambuf_iterator<char>()));
}
的調用來填充矢量失敗,拋出「不良分配」異常。
閱讀第一個文件時,羣體有時會失敗;有時在第二或第三次失敗。我正在使用Visual Studio 2010並將我的代碼編譯爲32位,它應該能夠處理高達2Gb的代碼。我使用的是16Gb RAM的機器,至少10Gb空閒,所以缺少可用內存不是問題。調試和發佈配置中都會出現該錯誤。
預分配內存reserve
沒有幫助。
該向量的max_size
屬性返回2^32,所以它看起來不是容器中的限制。
代碼很好,大小合併大小大於180Mb的小文件,使我認爲我的代碼正在碰到邊界。
是否有一種可接受的方式來從大型輸入文件填充矢量?我想避免遍歷文件中的每個字節,並認爲使用istreambuf_iterator
將針對這種操作進行優化。
是的,它是一個矢量。 – pdm2011