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

Reply via email to