You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pig.apache.org by "Rohini Palaniswamy (JIRA)" <ji...@apache.org> on 2014/03/20 01:05:43 UTC
[jira] [Created] (PIG-3823) Use newTupleNoCopy instead of newTuple
wherever possible to avoid object copy penalty
Rohini Palaniswamy created PIG-3823:
---------------------------------------
Summary: Use newTupleNoCopy instead of newTuple wherever possible to avoid object copy penalty
Key: PIG-3823
URL: https://issues.apache.org/jira/browse/PIG-3823
Project: Pig
Issue Type: Bug
Reporter: Rohini Palaniswamy
Assignee: Rohini Palaniswamy
The readFields() method of all Tuple implementations do a mFields.clear() and then load data into the same tuple. If that was changed to do
{code}
if (mFields.size() > 0) {
mFields = new ArrayList<Object>(mFields.size());
}
{code}
many places in code where we do TupleFactory.newTuple(List c); can be replaced with TupleFactory.newTupleNoCopy(List c);. This will avoid a expensive System.arrayCopy() call which is a native method.
POPackage.java getValueTuple()
{code}
if( keyLookupSize > 0) {
// we have some fields of the "value" in the
// "key".
int finalValueSize = keyLookupSize + val.size();
copy = mTupleFactory.newTuple(finalValueSize);
int valIndex = 0; // an index for accessing elements from
// the value (val) that we have currently
for(int i = 0; i < finalValueSize; i++) {
Integer keyIndex = keyLookup.get(i);
if(keyIndex == null) {
// the field for this index is not in the
// key - so just take it from the "value"
// we were handed
copy.set(i, val.get(valIndex));
valIndex++;
} .....
} else if (isProjectStar) {
// the whole "value" is present in the "key"
copy = mTupleFactory.newTuple(keyAsTuple.getAll());
} else {
// there is no field of the "value" in the
// "key" - so just make a copy of what we got
// as the "value"
copy = mTupleFactory.newTuple(val.getAll());
}
{code}
Some cases might take a slight hit in GC due to new ArrayList initialization. For eg: if( keyLookupSize > 0) condition in above code as it does not do a newTuple. But other 2 cases would greatly benefit as we can avoid arraylist copy. Same in POFRJoin.
Will run some tests to validate the theory and post a patch.
--
This message was sent by Atlassian JIRA
(v6.2#6252)