Research on preventative rail maintenance to date majors on small or artificial problem instances, not applicable to real-world use cases. This article tackles large, real-world rail maintenance scheduling problems. Maintenance costs and availability of the infrastructure need to be optimized, while adhering to a set of complex constraints. We develop and compare three generic approaches: an evolution strategy, a greedy metaheuristic, and a hybrid of the two. As a case study, we schedule major preventive maintenance of a full year in the complete rail infrastructure of the Netherlands, one of the busiest rail networks of Europe. Empirical results on two real-world datasets show the hybrid approach delivers high-quality schedules.