the while loop exits after about 240 rows. I'm assuming it's due to the size of the file
I doubt if your problem is due to the size of the file - Parse::CSV is designed specifically to handle large files, and only reads one line at a time.
You could try adding this line after your loop:
print $parser->errstr;
I suspect, though, that the problem has something to do with the structure of your data - does it change in any way around row 240? You mention that some of the columns have commas within - maybe you could post some of your input data here (inside <code></code> tags).