I'm not sure I understand that snippet correctly, but it looks like, if there were, say, 3 elements in your hash, then the output might be something like:
<table>
<tr> ... first element </tr>
<tr> ... first element </tr>
<tr> ... second element </tr>
<tr> ... first element </tr>
<tr> ... second element </tr>
<tr> ... third element </tr>
</table>
And if the first element (and each of the others?) has a 2MB string in it, that's going to take a long time to convey to a browser (and the browser may have some trouble accommodating all that data).
I'm not familiar with a module called "P3::util::HTML", but if its "doTableDetailRow()" function takes an array of table rows as its second parameter, I would expect that you should probably call it after the foreach loop, not inside the loop.
You might also want to think about the user-interface / legibility / viewability issues that would arise from having 2MB of data in a single row (or cell?) of an html table... Maybe there's a better way to do whatever it is you are trying to do?