Hi Lingyun, How much memory is installed on your computer? How much of it is available and which operating system are you using? Do you use page file/swap?
2009/4/15 Lingyun Yu <lingyun.yu...@gmail.com>: > And yes, > > after I did > if (NumPart > 1000) > { > try > { > vertices->reserve(NumPart); > } > catch (std::bad_alloc& e) > { > // handle exception here; log and return error from this function. > // alternatively, you can rethrow here, and catch in caller. > } > } > > it jumps to catch part. > > > 2009/4/15 Lingyun Yu <lingyun.yu...@gmail.com> >> >> Hi, Ismail, >> >> I don't understand how the "expanding" happen? >> I read all dataset into an array of P, then when it expands? and why? >> and what's old array? >> >> On Tue, Apr 14, 2009 at 2:27 PM, Ismail Pazarbasi <pazarb...@gmail.com> >> wrote: >>> >>> Hi Lingyun, >>> >>> std::bad_alloc is thrown when operator new cannot allocate memory, >>> which indicates there is not enough memory. You may reserve your array >>> before hand, as Paul mentioned, but it may throw as well. This could >>> reduce, if nothing, copy operations. It may also prevent exception, >>> because when expanding, std::vector will have two large copies at the >>> same time. That is: >>> e.g. old array length was 1500000 >>> expand by 500000 >>> While allocating 2000000 elements, previous 1500000 elements will also >>> be alive/allocated, that requires room for 3500000 elements in total. >>> Resize may reduce this cost to 2000000 only, because vector will not >>> have to expand afterwards (i.e. during push_back), which requires a >>> copy operation. Note that C++ standard allocator doesn't do realloc(). >>> Instead, vector will allocate a block of N * sizeof(T) items (or >>> little more), copy existing block into new one, then free existing >>> block. >>> >>> // instantiate vertices normally >>> vertices = new osg::Vec3Array; >>> >>> // if number of parts is greater than 1000, >>> // reserve your items before. >>> if (NumPart > 1000) >>> { >>> try >>> { >>> vertices->reserve(NumPart); >>> } >>> catch (std::bad_alloc& e) >>> { >>> // handle exception here; log and return error from this function. >>> // alternatively, you can rethrow here, and catch in caller. >>> } >>> } >>> >>> // wrap your push_back calls in a try-catch block >>> try >>> { >>> vertices->push_back(...); >>> } >>> catch (std::exception&) >>> { >>> } >>> >>> To be on the safe side, handle your exceptions and wrap your pointers >>> in a smart pointer class. If an exception is thrown and you >>> rethrow/return from function, you need to delete your Geode, Group and >>> other objects. You may get all these for free, if you use a smart >>> pointer (osg::ref_ptr<T>, in this case, as osg::Node's destructor is >>> protected, IIRC, which prevents it to be "delete"d externally, but >>> only when its ref count reaches 0). >>> >>> HTH >>> Ismail >>> >>> 2009/4/13 Paul Martz <pma...@skew-matrix.com>: >>> > Hi Lingyun Yu -- >>> > You don't have a variable named 'galaxy' defined, so the >>> > "addDrawable(galaxy)" is suspicious. >>> > >>> > I'd so a resize on the vertex and color arrays, rather than a >>> > push_back, for >>> > efficiency reasons. >>> > >>> > I don't think numParts>1000000 should cause any problems. OpenGL doesn >>> > not >>> > place an upper limit on the number of primitives you can render with a >>> > single glDrawArrays call. >>> > >>> > I don't really see anything that would cause a crash so I guess you >>> > should >>> > use a debugger and look at the call stack, like you would any other >>> > crash. >>> > >>> > Paul Martz >>> > Skew Matrix Software LLC >>> > http://www.skew-matrix.com >>> > +1 303 859 9466 >>> > >>> > >>> > -----Original Message----- >>> > From: osg-users-boun...@lists.openscenegraph.org >>> > [mailto:osg-users-boun...@lists.openscenegraph.org] On Behalf Of Sent: >>> > Monday, April 13, 2009 9:27 AM >>> > To: osg-users@lists.openscenegraph.org >>> > Subject: [osg-users] Problem of points showing >>> > >>> > Hi, everybody, >>> > >>> > I met a problem when I want to show huge amount of points, as you can >>> > see >>> > the code below, if my NumPart is 1000000, no problem, it shows points >>> > properly. But if the NumPart is 2000000, then it shows a lot of lines. >>> > If >>> > NumPart is even bigger, the program complained like this:Microsoft C++ >>> > exception: std::bad_alloc at memory location 0x0030e898. >>> > >>> > I don't know that's because the dataset is too big or not? because >>> > while it >>> > shows not so many points, everything goes well. >>> > >>> > By the way, the data in P array are all right. >>> > >>> > osg::Geode *makeGalaxy() >>> > { >>> > osg::Geode *geode = new osg::Geode(); >>> > osg::Geometry *geometry= new osg::Geometry(); >>> > osg::Vec3Array *vertices = new osg::Vec3Array(); >>> > osg::Vec4Array *colors = new osg::Vec4Array(); >>> > osg::Vec4 ini(1,0.1,0.55,1); >>> > osg::Vec4 fin(0,1,0,1); >>> > >>> > for (int i = 1; i <= NumPart; i++) >>> > { >>> > >>> > vertices->push_back(osg::Vec3(P[i].Pos[0],P[i].Pos[1],P[i].Pos[2])); >>> > colors->push_back(ini+(fin-ini)*(i*1/NumPart)); >>> > } >>> > geometry->setVertexArray(vertices); >>> > geometry->setColorArray(colors); >>> > geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX); >>> > geometry->addPrimitiveSet(new >>> > osg::DrawArrays(osg::PrimitiveSet::POINTS, >>> > 0, NumPart)); >>> > geode->addDrawable(galaxy); >>> > return geode; >>> > } >>> > >>> > ... >>> > >>> > Thank you. >>> > >>> > ------------------ >>> > Read this topic online here: >>> > http://forum.openscenegraph.org/viewtopic.php?p=10166#10166 >>> > >>> > >>> > >>> > >>> > >>> > _______________________________________________ >>> > osg-users mailing list >>> > osg-users@lists.openscenegraph.org >>> > >>> > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >>> > >>> > _______________________________________________ >>> > osg-users mailing list >>> > osg-users@lists.openscenegraph.org >>> > >>> > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >>> > >>> > >>> _______________________________________________ >>> osg-users mailing list >>> osg-users@lists.openscenegraph.org >>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> >> >> >> -- >> Cheers, >> Yun > > > > -- > Cheers, > Yun > > _______________________________________________ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > _______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org