South Africa's fast bowlers ripped through Bangladesh's batting as the home side gained a massive 426-run first innings lead on the second day of the second and final Test at Mangaung Oval on Saturday.
Bangladesh were bowled out for 147 in reply to South Africa's 573 for four declared.
The hosts enforced the follow-on and Bangladesh were seven for no wicket when bad light stopped play.
Kagiso Rabada took five for 33 and new ball partner Duanne Olivier claimed three for 40.
Only wicketkeeper Liton Das, with a career-best 70, offered prolonged resistance to the pace barrage as the gulf between the sides in South African conditions was ruthlessly exposed.
Bangladesh's dismal showing was in stark contrast to the ease with which South Africa's batsmen dominated the visiting bowlers.
Hashim Amla and captain Faf du Plessis completed centuries before South Africa declared.
Amla (132) and Du Plessis (135 not out) became the third and fourth centurions of the innings. They joined Dean Elgar and Aiden Markram, who made centuries on the first day.
Amla's 28th Test hundred took him past former captain Graeme Smith on South Africa's all-time century-makers list, behind only Jacques Kallis, who made 45.
The only previous occasion on which South Africa scored four centuries in an innings was against the West Indies in a high-scoring draw in St John's in 2004/05.
Du Plessis hit his seventh Test century – his first in 19 innings going back to a day-night Test against Australia in Adelaide in November 2016.
Soumya Sarkar was the first Bangladeshi to fall, going too far across his stumps in the seventh over to be bowled behind his legs by Rabada.
Mominul Haque gloved a legside catch to wicketkeeper Quinton de Kock off Olivier before Bangladesh captain Mushfiqur Rahim fell to a sensational diving catch by Temba Bavuma at gully off Olivier.
Bangladesh's misery continued when Mahmudullah sparred at a lifting ball from Parnell and was caught behind.
Opening batsman Imrul Kayes was 26 not out at tea but was caught behind off Rabada three balls after the interval.
Das played with spirit and struck 13 boundaries in a 77-ball innings before an attempted pull shot against Rabada looped behind the slips for Du Plessis to run back and hold the catch.