You could also partition the data and ListPlot3D in parallel. Then you can combine the plots with Show.
Let's partition the desired range into overlapping intervals
fullRange = {{0.00001, 0.2}, {0, 2}};
rangeSplits = MapThread[Array[# &, #1, #2] &, {{8, 2}, fullRange}];
partRanges = partitionWithOverlap /@ rangeSplits;
finalRanges = Flatten[Outer[List, Sequence @@ partRanges, 1], 1];
Since your data is very dense along the y axis, but not so much on the x, I chose 8 partitions for the y, and 1 for the x.
{{{0.00001, 0.0308664}, {0, 2}}, {{0.0262936, 0.061722}, {0,
2}}, {{0.052578, 0.0925776}, {0, 2}}, {{0.0788624, 0.123433}, {0,
2}}, {{0.105147, 0.154289}, {0, 2}}, {{0.131431, 0.185144}, {0,
2}}, {{0.157716, 0.2}, {0, 2}}, {{0.184, 0.2}, {0, 2}}}
Now we partition the data according to the ranges and plot them with ListPlot3D
ClearAll[partitionData]
partitionData[partition_, data_] :=
Select[data,
And[Between[ partition[[2]]]@#[[1]],
Between[ partition[[1]]]@#[[2]]] &]
partitionedData = ParallelMap[partitionData[#, cdata] &, finalRanges]
Show[
ParallelMap[ListPlot3D[#, Mesh -> {10, 1}] &, partitionedData],
PlotRange -> All, ViewPoint -> {2.4, 2, 1.2}]]

The mesh looks funny, but it works!
Benchmarks
The total time for this endeavour (data partitioning and plotting)
AbsoluteTiming[
partitionedData = ParallelMap[partitionData[#, cdata] &, finalRanges];
Show[ParallelMap[ListPlot3D[#, Mesh -> {10, 1}] &, partitionedData],
PlotRange -> All, ViewPoint -> {2.4, 2, 1.2}]]
{102.345, (* plot *)
If you remove the Parallel from the Maps, it jumps to 307s. A 3 times speedup from parallelization! But let's compare that to Jason B's methods
AbsoluteTiming[func = Interpolation[cdata];
Plot3D[func[x, y], {y, 0.00001, 0.2}, {x, 0, 2},
ViewPoint -> {2.4, 2, 1.2}]
]
{0.273307, (* plot *)}
AbsoluteTiming[
ListPlot3D[Partition[ccdata[[All, 3]], 20000],
DataRange -> {{0, .2}, {0, 2}}, ViewPoint -> {2.4, 2, 1.2}]
]
{16.1234, (* plot *)}
It works, but smarter sampling and interpolation clearly beats brute force!
Helper Functions
partitionWithOverlap is a helper function that creates intervals with a configurable % overlap from a list of endpoints, required to avoid blank seams between the plots
partitionWithOverlap[{0, 10, 20}] == {{0, 10.8}, {9.2, 20}, {18.4, 20}}
partitionWithOverlap[{a_, b_}] := {{a, b}}
partitionWithOverlap[range_, factor_: 0.08] :=
ReplacePart[
MapThread[{Max[#1, range[[1]]],
Min[#2, range[[-1]]]} &, {range*(1 - factor),
RotateLeft@range*(1 + factor)}], {{1, 1} -> range[[1]], {-1, 2} ->
range[[-1]]}]
yourlist[[ ;; ;; 100]]using every 100th point.