giraph-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alessandro Presta <>
Subject Re: [jira] [Created] (GIRAPH-547) Allow in-place modification of edges
Date Tue, 05 Mar 2013 05:19:44 GMT
Hi Jiadong,

Yes, that's not recommended because some optimized implementations reuse
the same Edge object, so whatever change you make has no effect on the
underlying data.
It happens to work when using EdgeListVertex because there we actually
have one Edge object per edge.


On 3/4/13 9:06 PM, "Jiadong Wu" <> wrote:

>Hi guys,
>I may not understand this issue clearly, but if we do want in-place
>modification why not simply use edge.getValue().set(newValue) instead?
>I used this method a lot in my code, where the edge value is a
>LongWritable. Is there any potential problem?
>On Fri, Mar 1, 2013 at 2:53 PM, Alessandro Presta (JIRA)
><> wrote:
>> Alessandro Presta created GIRAPH-547:
>> ----------------------------------------
>>              Summary: Allow in-place modification of edges
>>                  Key: GIRAPH-547
>>                  URL:
>>              Project: Giraph
>>           Issue Type: New Feature
>>             Reporter: Alessandro Presta
>>             Assignee: Alessandro Presta
>> This is a somewhat long term item.
>> Because of some optimized edge storage implementations (byte array,
>>primitive array), we have a contract with the user that Edge objects
>>returned by getEdges() are read-only.
>> One concrete example where this is needed: in the weighted version of
>>PageRank, you can store the weight sum and normalize each message sent,
>>or you could more efficiently normalize the out-edges once in superstep
>> The Pregel paper describes an OutEdgeIterator that allows for in-place
>>modification of edges. I can see how that would be easy to implement in
>>C++, where there is no need to reuse objects.
>> Giraph "unofficially" supports this if one is using generic collections
>>to represent edges (e.g. ArrayList or HashMap).
>> It may be trickier in some optimized implementations, but in principle
>>it should be doable.
>> One way would be to have some special MutableEdge implementation which
>>calls back to the edge data structure in order to save modifications:
>> {code}
>> for (Edge<I, E> edge : getEdges()) {
>>   edge.setValue(newValue);
>> }
>> {code}
>> Another option would be to add a special set() method to our edge
>>iterator, where one can replace the current edge:
>> {code}
>> for (EdgeIterator<I, E> it = getEdges().iterator(); it.hasNext();) {
>>   Edge<I, E> edge =;
>>   edge.setValue(newValue);
>>   it.set(edge);
>> }
>> {code}
>> We could actually implement the first version as syntactic sugar on top
>>of the second version (the special MutableEdge would need a reference to
>>the iterator in order to call set(this)).
>> --
>> This message is automatically generated by JIRA.
>> If you think it was sent incorrectly, please contact your JIRA
>> For more information on JIRA, see:

View raw message