Why don't you run a quicksort on the entire file, then if you only need a yes/no on whether a duplicate exists, you can check each string against the string just before/after it. In fact, if you write the quicksort yourself, you can have it check for duplicates as it sorts.
Alternatively, you could just bucketsort based on the first character of the string, then use multithreading and compare the strings in each bucket (strings in different buckets would never match--they start with different chars).
You could even bucketsort the buckets based on the second character... then bucket sort those buckets based on the third, etc., all the way down. You're end point is reached either when all the buckets have just 1 string in them (no duplicates) or when your buckets with multiple strings contain strings that are shorter then the number of levels deep you are (in which case, you have a duplicate). Again, use multithreading for more speed.