MapReduce的C#实现及单元测试(试验)

时间:2021-04-04 18:23:31

MapReduce.cs类文件代码  MapReduce的执行方法

using System;
using System.Collections.Generic;
//using System.Linq;
//using System.Threading.Tasks;

namespace MapReduce
{
/// <summary>
/// Very Simple MapReduce implementation in C#
/// </summary>
/// <remarks>
/// Thanks to Stephan Brenner. Refactored for C# 4.0
/// </remarks>
public class MapReduce
{
public static int NumberOfCores = 4;

public static Dictionary<T3, List<T4>> Execute<T1, T2, T3, T4>(
Func<T1, T2, List<KeyValuePair<T3, T4>>> mapFunction,
Func<T3, List<T4>, List<T4>> reduceFunction,
Dictionary<T1, T2> input)
{
var maps = new Dictionary<T3, List<T4>>();
input.DivvyUp(
NumberOfCores,
l => l.ForEach(kv => maps.Add(mapFunction(kv.Key, kv.Value), i => i.Key, i => i.Value)));

var result = new Dictionary<T3, List<T4>>();
maps.DivvyUp(
NumberOfCores,
m => m.ForEach(map => result.Add(reduceFunction(map.Key, map.Value), i => map.Key, i => i)));

return result;
}
}
}

 

EnumerableExtensions.cs类文件  MapReduce执行过程中调用的枚举扩展方法

using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace MapReduce
{
public static class EnumerableExtensions
{
#region -- IDictionary --

/// <summary>
/// 字典值集合中添加值?
/// Adds an Enumerable to a Dictionary
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TK"></typeparam>
/// <typeparam name="TV"></typeparam>
/// <param name="dictionary"></param>
/// <param name="list"></param>
/// <param name="keySelector"></param>
/// <param name="valueSelector"></param>
public static void Add<T, TK, TV>(this IDictionary<TK, List<TV>> dictionary,
IEnumerable<T> list,
Func<T, TK> keySelector,
Func<T, TV> valueSelector)
{
lock (dictionary)
{
foreach (var item in list)
{
var key = keySelector(item);

if (!dictionary.ContainsKey(key))
{
dictionary[key] = new List<TV>();
}

dictionary[key].Add(valueSelector(item));
}
}
}

#endregion

#region -- IEnumberable --

/// <summary>
/// 遍历执行
/// Iterates over an Enumerable
/// </summary>
/// <remarks>
/// why wasn't this part of LINQ?
/// </remarks>
/// <typeparam name="T"></typeparam>
/// <param name="enumerable"></param>
/// <param name="action"></param>
public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
{
foreach (var item in enumerable)
{
action(item);
}
}

/// <summary>
/// Divides an enumerable into equal parts and performs an action on those parts
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="enumerable"></param>
/// <param name="parts"></param>
/// <param name="action"></param>
public static void DivvyUp<T>(this IEnumerable<T> enumerable, int parts, Action<IEnumerable<T>, int, int> action)
{
if (enumerable == null)
{
throw new ArgumentNullException("enumerable");
}

if (action == null)
{
throw new ArgumentNullException("action");
}

var actions = new List<Action>();

if (parts == 0)
parts = 1;

int count = enumerable.Count();
int itemsPerPart = count / parts;

if (itemsPerPart == 0)
itemsPerPart = 1;

for (int i = 0; i < parts; i++)
{
var collection = enumerable
.Skip(i * itemsPerPart)
.Take(i == parts - 1 ? count : itemsPerPart);

int j = i; // access to modified closure safety
actions.Add(() => action(collection, j, itemsPerPart));
}

//并行执行对象列表中方法
Parallel.Invoke(actions.ToArray());
}

/// <summary>
/// 接口的扩展方法(可枚举对象的扩展方法)
/// Divides an enumerable into equal parts and performs an action on those parts
/// </summary>
/// <typeparam name="T">?KeyValuePair<T3,List<T4>>?</typeparam>
/// <param name="enumerable">可枚举对象</param>
/// <param name="parts">均分数</param>
/// <param name="action">执行方法</param>
public static void DivvyUp<T>(this IEnumerable<T> enumerable, int parts, Action<IEnumerable<T>> action)
{
DivvyUp(enumerable, parts, (subset, i, j) => action(subset));
}

#endregion
}
}

 



TestAllInfo.cs  单位测试工具测试MapReduce的实现过程

MapReduce的C#实现及单元测试(试验)MapReduce的C#实现及单元测试(试验)
  1 using System.IO;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Diagnostics;
5 using MapReduce;
6 using NUnit.Framework;
7 using Microsoft.CSharp.RuntimeBinder;
8
9 namespace nUnitTest
10 {
11 [TestFixture]
12 public class TestAllInfo
13 {
14 [Test]
15 public void TestDynamicKeyWord()
16 {
17 //动态加载类型 (运行时确定类型)
18 dynamic target = "动态类型 panchzh 测试";
19 dynamic arg = "panchzh";
20 bool bTestResult = target.Contains(arg);
21 }
22 /// <summary>
23 /// 测试枚举方法
24 /// </summary>
25 [Test]
26 public void DivvyUp_Splits_List_Of_Two()
27 {
28 var list = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
29 list.DivvyUp(2, subset =>
30 {
31 Assert.IsNotNull(subset);
32 Assert.IsTrue(4.Equals(subset.Count()));
33 });
34 }
35 /// <summary>
36 /// 测试枚举方法
37 /// </summary>
38 [Test]
39 public void DivvyUp_Splits_List_Of_Three()
40 {
41 var list = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
42 list.DivvyUp(3, subset =>
43 {
44 Assert.IsNotNull(subset);
45 Assert.IsTrue(3.Equals(subset.Count()));
46 });
47 }
48 /// <summary>
49 /// 测试枚举方法
50 /// </summary>
51 [Test]
52 public void DivvyUp_Splits_Uneven_Lists()
53 {
54 var list = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
55 list.DivvyUp(2, (subset, i, j) =>
56 {
57 Assert.IsNotNull(subset);
58 if (i == 0)
59 Assert.IsTrue(4.Equals(subset.Count()));
60 if (i == 1)
61 Assert.IsTrue(5.Equals(subset.Count()));
62 });
63 }
64 /// <summary>
65 /// 测试枚举方法
66 /// </summary>
67 [Test]
68 public void DivvyUp_Waits_For_All_Actions_To_Complete()
69 {
70 int i = 0;
71 var list = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
72 list.DivvyUp(9, j => i++);
73 Assert.IsTrue(9.Equals(i));
74 }
75
76 /// <summary>
77 /// 文件中查找单词
78 /// </summary>
79 [Test]
80 public void TestFindWordInFile()
81 {
82 DirectoryInfo dir = new DirectoryInfo(@"E:\SourceCode\mapreduce-csharp-master\mapreduce-csharp-master\Tests\App_Data");
83 Dictionary<FileInfo, string> fileSearchData = new Dictionary<FileInfo, string>();
84 dir.GetFiles("*.txt").ToList().ForEach(f => fileSearchData.Add(f, File.ReadAllText(f.FullName)));
85 var output = MapReduceClass.Execute(Map_FindWord, Reduce_FindWord, fileSearchData);
86
87 //单元测试断言
88 Assert.IsNotEmpty(output);
89 Assert.Contains("Vestibulum", output.Keys);
90 Assert.LessOrEqual(output["Vestibulum"][0], 100);
91 if (!output["Vestibulum"][0].Equals(100))
92 {
93 Trace.WriteLine("Not Equal");
94 Debug.WriteLine("debug test");
95 }
96 Assert.IsTrue(output["Vestibulum"][0].Equals(10));
97 }
98 public static List<KeyValuePair<string, int>> Map_FindWord(FileInfo document, string text)
99 {
100 List<KeyValuePair<string, int>> result = new List<KeyValuePair<string, int>>();
101 var items = text.Split('\n', ' ', '.', ',', '\r');
102 result = items.Select(item => new KeyValuePair<string, int>(item, 1)).ToList();
103 return result;
104 }
105 public static List<int> Reduce_FindWord(string word, List<int> wordCounts)
106 {
107 if (wordCounts == null) return null;
108 var result = new List<int> { 0 };
109 foreach (var value in wordCounts)
110 {
111 result[0] += value;
112 }
113 return result;
114 }
115
116
117 [Test]
118 public void TestFindsBasicKeywords()
119 {
120 string word = "dragon";
121 int count = 6;
122 int charCount = word.Length * count;
123 Dictionary<string, string> input = new Dictionary<string, string>
124 {
125 {"Dragonslayer", "Dragons ate some people"},
126 {"War of the Ancients", "The dragon liked to eat bears"},
127 {"War of the Ancients Part 2", "The multitude of Dragon could only eat One Big Bear"},
128 {"Nature's Splendor", "The bear was at peace with his life. He was Bear."},
129 {"Mothership", "The Spaceship was not a mother ship"},
130 {"Lost Viking", "The little Spaceship tried to get home"},
131 {"Abduction", "The big Spaceship got some rednecks"},
132 };
133 var output = MapReduceClass.Execute(Map_FindsBasic, Reduce_FindsBasic, input);
134
135 //单元测试断言
136 Assert.Contains(word, output.Keys);
137 Assert.LessOrEqual(output[word][0], count);
138 Assert.IsFalse(output[word][1].Equals(charCount));
139 }
140 public static List<KeyValuePair<string, int>> Map_FindsBasic(string document, string words)
141 {
142 var items = words.Split('\n', ' ', '.');
143 return items.Select(item => new KeyValuePair<string, int>(item, 1)).ToList();
144 }
145 public static List<int> Reduce_FindsBasic(string word, List<int> words)
146 {
147 if (words == null) return null;
148 var result = new List<int> { 0, 0 };
149 foreach (var value in words)
150 {
151 result[0] += value; // number of words
152 result[1] += word.Length; // number of characters
153 }
154 return result;
155 }
156
157 public Dictionary<char, List<int>> _output;
158 public void FileCharacterTests()
159 {
160 //var di = new DirectoryInfo(String.Format(@"{0}\App_Data\", Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)));
161 var di = new DirectoryInfo(@"E:\SourceCode\mapreduce-csharp-master\mapreduce-csharp-master\Tests\App_Data"); ;
162 var fileSearchData = new Dictionary<FileInfo, string>();
163 di.GetFiles("*.txt").ToList().ForEach(f => fileSearchData.Add(f, File.ReadAllText(f.FullName)));
164 _output = MapReduceClass.Execute(Map_FileCharacter, Reduce_FileCharacter, fileSearchData);
165 }
166 [Test]
167 public void MapReduce_Finds_All_Characters()
168 {
169 FileCharacterTests();
170 Assert.IsTrue(68.Equals(_output.Keys.Count));
171 }
172 [Test]
173 public void MapReduce_Finds_Most_Common_Character()
174 {
175 FileCharacterTests();
176 var ignoreCharacters = new[] { ' ' };
177 var mostCommonMatch = _output
178 .Where(kv => !ignoreCharacters.Contains(kv.Key))
179 .OrderByDescending(kv => kv.Value.Sum())
180 .FirstOrDefault();
181 Assert.IsTrue('i'.Equals(mostCommonMatch.Key));
182 Assert.IsTrue(2941.Equals(mostCommonMatch.Value.Sum()));
183 }
184 [Test]
185 public void MapReduce_Finds_Keywords_In_Flat_Files()
186 {
187 char character = 'f';
188 int times = 102;
189 FileCharacterTests();
190 Assert.IsNotEmpty(_output);
191 Assert.Contains(character, _output.Keys);
192 Assert.IsFalse(times.Equals(_output[character][0]));
193 }
194 public static List<KeyValuePair<char, int>> Map_FileCharacter(FileInfo document, string text)
195 {
196 return text.Select(item => new KeyValuePair<char, int>(item, 1)).ToList();
197 }
198 public static List<int> Reduce_FileCharacter(char character, List<int> characterCounts)
199 {
200 if (characterCounts == null) return new List<int>();
201 var result = new List<int> { 0 };
202 foreach (var value in characterCounts)
203 {
204 result[0] += value;
205 }
206 return result;
207 }
208
209 }
210 }
View Code

 

nunit.framework.dll 需下载

LoremIpsum_I.txt  测试文本文件

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras auctor eros ac lectus vulputate a cursus lectus tempor. Aenean nec purus eu eros lacinia hendrerit pretium tempor magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam sagittis egestas neque, at cursus risus accumsan in. Mauris tellus nisi, ullamcorper quis posuere sed, tincidunt sit amet nibh. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas sed tortor at leo fringilla ultrices. Vivamus orci risus, rhoncus cursus iaculis imperdiet, aliquet sed quam. Sed erat neque, pretium nec imperdiet id, congue quis dolor. Curabitur in metus vel leo ullamcorper ullamcorper.

Morbi tincidunt, elit sed vestibulum convallis, est turpis euismod erat, nec fringilla magna ante vel tellus. Fusce vel massa justo, ut sagittis justo. Vestibulum lacinia rutrum nisi, eget accumsan lacus suscipit non. Nunc convallis ultrices erat sit amet congue. Integer varius iaculis urna, ac varius leo porttitor nec. Ut auctor semper erat, quis consequat augue posuere eget. Etiam magna ligula, scelerisque vitae pellentesque euismod, egestas ac nisi. Etiam malesuada vulputate velit at euismod. Mauris at sem justo, nec sagittis dui. Proin molestie hendrerit quam, ut elementum est rutrum a. Mauris aliquam rhoncus viverra. Morbi vel dapibus mi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nullam ornare varius orci nec rhoncus. Praesent nec lacus a enim volutpat blandit a ut ante. Curabitur sed magna quam. Aenean est erat, molestie ullamcorper suscipit a, dictum eu arcu. Sed fringilla risus nisl, quis congue diam. Aliquam lacinia, arcu quis lacinia fringilla, metus quam fringilla odio, ut cursus dolor dui sit amet orci. Etiam eget mauris ut risus iaculis ornare.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ut tortor turpis. In vel augue et lectus ultricies hendrerit. Suspendisse commodo, nibh ac tincidunt dictum, turpis nisi tristique justo, ultrices tempor metus nunc sit amet leo. Pellentesque vitae nunc sem, eu porttitor leo. Etiam ac justo eu leo rutrum varius sit amet et urna. Vestibulum tellus mauris, hendrerit vitae adipiscing et, congue mollis magna. Donec bibendum sodales purus eu vehicula. Suspendisse non libero nec elit imperdiet mattis vel ac orci. Nam accumsan pellentesque mollis.

Vestibulum turpis magna, faucibus in commodo a, auctor sit amet leo. In ultricies adipiscing diam. Nulla fringilla mollis ligula, ut pharetra leo eleifend sit amet. In viverra purus ut lectus mattis non facilisis ipsum sagittis. Sed a augue sed ante sagittis pellentesque. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc pretium quam eu est sollicitudin et adipiscing sapien facilisis. Integer commodo leo vitae urna feugiat mollis. Pellentesque sodales tortor sit amet risus dignissim vitae vulputate leo convallis. Quisque non libero nibh, et aliquam nibh. Ut molestie urna ut mauris mollis facilisis. Curabitur nunc lorem, tristique vel pulvinar vitae, auctor quis est. In quis arcu quam, non blandit mauris. Nullam iaculis laoreet nibh, in luctus enim varius luctus. Curabitur vel luctus massa.

Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Etiam vel velit vel turpis tincidunt commodo. Fusce in magna odio, in pretium augue. Morbi condimentum leo ut elit tincidunt sed tincidunt risus tincidunt. Sed faucibus suscipit mattis. Cras sit amet arcu eros. Nunc in gravida leo. Ut nec lorem nisl, sed aliquam erat. Praesent purus sem, sagittis sed fermentum eget, lacinia eget sem. Ut sagittis molestie mollis. Curabitur porta congue dapibus.

Donec magna est, vestibulum eu eleifend ac, fermentum eget dolor. Nulla vestibulum mattis arcu vitae ullamcorper. Integer consequat dapibus adipiscing. Aliquam erat volutpat. Nam pellentesque iaculis neque vestibulum auctor. Donec sed nisl arcu. Vestibulum porta magna ipsum. Sed lacus nisl, tempus id convallis et, interdum ut augue. Suspendisse interdum odio lobortis ante consectetur ut iaculis purus interdum. Nunc eleifend elit faucibus eros bibendum a consequat elit dictum. Donec at urna vitae urna sagittis feugiat. Nullam velit sem, mollis id bibendum eu, egestas nec sem. Sed porta aliquet est, euismod mattis enim viverra auctor. Nam nibh felis, lacinia eu posuere quis, tempor at velit. Nulla dignissim mollis orci et fermentum. Nulla congue ultrices auctor. Phasellus condimentum mattis metus, et dignissim lorem sagittis ac. Donec congue elit felis. Mauris leo elit, euismod quis sollicitudin eu, tristique vitae orci.

Praesent ornare tellus at purus porta convallis. Vestibulum mollis risus ac quam tristique tincidunt sit amet eu sapien. Phasellus pellentesque laoreet consectetur. Vivamus vestibulum laoreet mollis. Suspendisse vitae lobortis velit. Phasellus a leo ligula. Morbi aliquam diam eget velit tristique at egestas massa gravida. Nulla facilisi. Vivamus augue lectus, molestie et euismod sit amet, rutrum at eros. Phasellus in odio enim, sit amet porta odio. Morbi et libero eget velit pellentesque suscipit. Nam nisl odio, gravida nec molestie eget, congue ac dolor. Sed felis leo, tempor aliquet placerat in, congue vel neque. Mauris ipsum dolor, volutpat ut ornare sed, pharetra vel enim.

Morbi eget nisl id mi adipiscing convallis ut nec nulla. Mauris in nisi odio, in pretium nisl. Vivamus pulvinar, tortor a gravida scelerisque, magna nibh elementum risus, ac laoreet lectus augue in massa. Aliquam adipiscing vulputate metus et tincidunt. Nunc fermentum tortor vel risus facilisis dapibus venenatis ac diam. Nunc venenatis, eros quis pretium ornare, augue dolor convallis ligula, vitae mattis magna quam eu dolor. Aliquam ac orci metus, ut viverra diam. Suspendisse potenti. Sed tincidunt viverra leo nec adipiscing. Cras congue, tortor ac consectetur imperdiet, ipsum metus pulvinar lectus, et porta sem diam quis risus. In eros sapien, condimentum semper placerat a, varius in metus. Proin suscipit pulvinar justo vel pulvinar. Sed eget ipsum a erat bibendum sodales at et metus. Proin diam enim, adipiscing nec pulvinar eget, semper consectetur arcu. Nulla ut mauris sed lectus porta hendrerit in vitae velit. Maecenas sed porta metus. Etiam commodo, tortor at ornare ullamcorper, mi velit pretium mauris, a iaculis risus lorem eu justo. Donec sollicitudin erat cursus turpis sollicitudin scelerisque. Suspendisse mollis orci eu metus ullamcorper nec hendrerit arcu molestie. Proin congue ullamcorper tristique.

Sed id dolor non massa ornare laoreet. Mauris et dolor non nibh porta commodo. Aenean dapibus rhoncus justo, id cursus quam condimentum non. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec lacus ante, pulvinar sit amet aliquet sodales, feugiat eget turpis. Aenean commodo sagittis urna at ultricies. Quisque et felis et nibh volutpat porttitor. Quisque at tellus mi, a placerat neque. Sed massa neque, elementum vitae pellentesque eu, suscipit in tellus. Morbi lacinia pellentesque nulla id placerat. Curabitur ultrices metus eget urna sagittis interdum. Aenean ultricies sollicitudin sapien, ut convallis eros accumsan ullamcorper. Aliquam erat volutpat. Fusce dictum fermentum pulvinar. Morbi vitae elit dui. Maecenas nec nunc ligula, interdum aliquet neque. Maecenas id massa tortor, venenatis sodales nisi. Pellentesque ut turpis ac odio auctor tincidunt sed scelerisque lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;

Sed faucibus libero eu nisl semper eget luctus est fringilla. Nullam consectetur vehicula interdum. Duis faucibus ipsum quis turpis porta vestibulum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer accumsan, dolor ut vulputate rhoncus, sem urna malesuada velit, nec lacinia mi mauris non ligula. Morbi at interdum enim. Aliquam facilisis accumsan feugiat. Aliquam pretium ligula quis metus sagittis egestas. Duis pulvinar massa vitae mauris vulputate porta. Aenean euismod massa ante. Nam eget dolor sed nisi sollicitudin interdum id sed risus. Sed accumsan elementum neque, eu condimentum elit fringilla tempus. Nulla accumsan adipiscing ipsum, ac molestie elit varius in. Integer nec fermentum odio. Phasellus pellentesque ipsum a nulla dictum bibendum. Curabitur euismod sollicitudin faucibus. Nullam porttitor lacus varius quam sollicitudin vel consectetur mi vulputate.

 

In Catilinam Prima.txt 测试文本文件

ORATIO IN L. CATILINAM PRIMA

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

[1] I. Quo usque tandem abutere, Catilina, patientia nostra? quam diu etiam furor iste tuus nos eludet? quem ad finem sese effrenata iactabit audacia? Nihilne te nocturnum praesidium Palati, nihil urbis vigiliae, nihil timor populi, nihil concursus bonorum omnium, nihil hic munitissimus habendi senatus locus, nihil horum ora voltusque moverunt? Patere tua consilia non sentis, constrictam iam horum omnium scientia teneri coniurationem tuam non vides? Quid proxima, quid superiore nocte egeris, ubi fueris, quos convocaveris, quid consilii ceperis, quem nostrum ignorare arbitraris? [2] O tempora, o mores! Senatus haec intellegit. Consul videt; hic tamen vivit. Vivit? immo vero etiam in senatum venit, fit publici consilii particeps, notat et designat oculis ad caedem unum quemque nostrum. Nos autem fortes viri satis facere rei publicae videmur, si istius furorem ac tela vitemus. Ad mortem te, Catilina, duci iussu consulis iam pridem oportebat, in te conferri pestem, quam tu in nos [omnes iam diu] machinaris.

[3] An vero vir amplissumus, P. Scipio, pontifex maximus, Ti. Gracchum mediocriter labefactantem statum rei publicae privatus interfecit; Catilinam orbem terrae caede atque incendiis vastare cupientem nos consules perferemus? Nam illa nimis antiqua praetereo, quod C. Servilius Ahala Sp. Maelium novis rebus studentem manu sua occidit. Fuit, fuit ista quondam in hac re publica virtus, ut viri fortes acrioribus suppliciis civem perniciosum quam acerbissimum hostem coercerent. Habemus senatus consultum in te, Catilina, vehemens et grave, non deest rei publicae consilium neque auctoritas huius ordinis; nos, nos, dico aperte, consules desumus.

[4] II. Decrevit quondam senatus, ut L. Opimius consul videret, ne quid res publica detrimenti caperet; nox nulla intercessit; interfectus est propter quasdam seditionum suspiciones C. Gracchus, clarissimo patre, avo, maioribus, occisus est cum liberis M. Fulvius consularis. Simili senatus consulto C. Mario et L. Valerio consulibus est permissa res publica; num unum diem postea L. Saturninum tribunum pl. et C. Servilium praetorem mors ac rei publicae poena remorata est? At [vero] nos vicesimum iam diem patimur hebescere aciem horum auctoritatis. Habemus enim huiusce modi senatus consultum, verum inclusum in tabulis tamquam in vagina reconditum, quo ex senatus consulto confestim te interfectum esse, Catilina, convenit. Vivis, et vivis non ad deponendam, sed ad confirmandam audaciam. Cupio, patres conscripti, me esse clementem, cupio in tantis rei publicae periculis me non dissolutum videri, sed iam me ipse inertiae nequitiaeque condemno.

[5] Castra sunt in Italia contra populum Romanum in Etruriae faucibus conlocata, crescit in dies singulos hostium numerus; eorum autem castrorum imperatorem ducemque hostium intra moenia atque adeo in senatu videtis intestinam aliquam cotidie perniciem rei publicae molientem. Si te iam, Catilina, comprehendi, si interfici iussero, credo, erit verendum mihi, ne non potius hoc omnes boni serius a me quam quisquam crudelius factum esse dicat. Verum ego hoc, quod iam pridem factum esse oportuit, certa de causa nondum adducor ut faciam. Tum denique interficiere, cum iam nemo tam inprobus, tam perditus, tam tui similis inveniri poterit, qui id non iure factum esse fateatur. [6] Quamdiu quisquam erit, qui te defendere audeat, vives, et vives ita, ut [nunc] vivis. multis meis et firmis praesidiis obsessus, ne commovere te contra rem publicam possis. Multorum te etiam oculi et aures non sentientem, sicut adhuc fecerunt, speculabuntur atque custodient.

III. Etenim quid est, Catilina, quod iam amplius expectes, si neque nox tenebris obscurare coetus nefarios nec privata domus parietibus continere voces coniurationis tuae potest, si illustrantur, si erumpunt omnia? Muta iam istam mentem, mihi crede, obliviscere caedis atque incendiorum. Teneris undique; luce sunt clariora nobis tua consilia omnia; quae iam mecum licet recognoscas.

[7] Meministine me ante diem XII Kalendas Novembris dicere in senatu fore in armis certo die, qui dies futurus esset ante diem VI Kal. Novembris, C. Manlium, audaciae satellitem atque administrum tuae? Num me fefellit, Catilina, non modo res tanta, tam atrox tamque incredibilis, verum, id quod multo magis est admirandum, dies? Dixi ego idem in senatu caedem te optumatium contulisse in ante diem V Kalendas Novembris, tum cum multi principes civitatis Roma non tam sui conservandi quam tuorum consiliorum reprimendorum causa profugerunt. Num infitiari potes te illo ipso die meis praesidiis, mea diligentia circumclusum commovere te contra rem publicam non potuisse, cum tu discessu ceterorum nostra tamen, qui remansissemus, caede te contentum esse dicebas?

[8] Quid? cum te Praeneste Kalendis ipsis Novembribus occupaturum nocturno impetu esse confideres, sensistin illam coloniam meo iussu meis praesidiis, custodiis, vigiliis esse munitam? Nihil agis, nihil moliris, nihil cogitas, quod non ego non modo audiam, sed etiam videam planeque sentiam. IV. Recognosce tandem mecum noctem illam superiorem; iam intelleges multo me vigilare acrius ad salutem quam te ad perniciem rei publicae. Dico te priore nocte venisse inter falcarios--non agam obscure--in M. Laecae domum; convenisse eodem complures eiusdem amentiae scelerisque socios. Num negare audes? quid taces? Convincam, si negas. Video enim esse hic in senatu quosdam, qui tecum una fuerunt.

[9] O di inmortales! ubinam gentium sumus? in qua urbe vivimus? quam rem publicam habemus? Hic, hic sunt in nostro numero, patres conscripti, in hoc orbis terrae sanctissimo gravissimoque consilio, qui de nostro omnium interitu, qui de huius urbis atque adeo de orbis terrarum exitio cogitent! Hos ego video consul et de re publica sententiam rogo et, quos ferro trucidari oportebat, eos nondum voce volnero!

Fuisti igitur apud Laecam illa nocte, Catilina, distribuisti partes Italiae, statuisti, quo quemque proficisci placeret, delegisti, quos Romae relinqueres, quos tecum educeres, discripsisti urbis partes ad incendia, confirmasti te ipsum iam esse exiturum, dixisti paulum tibi esse etiam nunc morae, quod ego viverem. Reperti sunt duo equites Romani, qui te ista cura liberarent et sese illa ipsa nocte paulo ante lucem me in meo lectulo interfecturos [esse] pollicerentur. [10] Haec ego omnia vixdum etiam coetu vestro dimisso comperi; domum meam maioribus praesidiis munivi atque firmavi, exclusi eos, quos tu ad me salutatum mane miseras, cum illi ipsi venissent, quos ego iam multis ac summis viris ad me id temporis venturos esse praedixeram.

V. Quae cum ita sint, Catilina, perge, quo coepisti, egredere aliquando ex urbe; patent portae; proficiscere. Nimium diu te imperatorem tua illa Manliana castra desiderant. Educ tecum etiam omnes tuos, si minus, quam plurimos; purga urbem. Magno me metu liberabis, dum modo inter me atque te murus intersit. Nobiscum versari iam diutius non potes; non feram, non patiar, non sinam. [11] Magna dis inmortalibus habenda est atque huic ipsi Iovi Statori, antiquissimo custodi huius urbis, gratia, quod hanc tam taetram, tam horribilem tamque infestam rei publicae pestem totiens iam effugimus.

Non est saepius in uno homine summa salus periclitanda rei publicae. Quamdiu mihi consuli designato, Catilina, insidiatus es, non publico me praesidio, sed privata diligentia defendi. Cum proximis comitiis consularibus me consulem in campo et competitores tuos interficere voluisti, compressi conatus tuos nefarios amicorum praesidio et copiis nullo tumultu publice concitato; denique, quotienscumque me petisti, per me tibi obstiti, quamquam videbam perniciem meam cum magna calamitate rei publicae esse coniunctam.

[12] Nunc iam aperte rem publicam universam petis, templa deorum inmortalium, tecta urbis, vitam omnium civium, Italiam [denique] totam ad exitium et vastitatem vocas. Quare, quoniam id, quod est primum, et quod huius imperii disciplinaeque maiorum proprium est, facere nondum audeo, faciam id, quod est ad severitatem lenius et ad communem salutem utilius. Nam si te interfici iussero, residebit in re publica reliqua coniuratorum manus; sin tu, quod te iam dudum hortor, exieris, exhaurietur ex urbe tuorum comitum magna et perniciosa sentina rei publicae. [13] Quid est, Catilina? num dubitas id me imperante facere, quod iam tua sponte faciebas? Exire ex urbe iubet consul hostem. Interrogas me, num in exilium; non iubeo, sed, si me consulis, suadeo.

VI. Quid est enim, Catilina, quod te iam in hac urbe delectare possit? in qua nemo est extra istam coniurationem perditorum hominum, qui te non metuat, nemo, qui non oderit.

Quae nota domesticae turpitudinis non inusta vitae tuae est? quod privatarum rerum dedecus non haeret in fama? quae lubido ab oculis, quod facinus a manibus umquam tuis, quod flagitium a toto corpore afuit? cui tu adulescentulo, quem corruptelarum inlecebris inretisses, non aut ad audaciam ferrum aut ad lubidinem facem praetulisti? [14] Quid vero? nuper cum morte superioris uxoris novis nuptiis domum vacuefecisses, nonne etiam alio incredibili scelere hoc scelus cumulasti? quod ego praetermitto et facile patior sileri, ne in hac civitate tanti facinoris inmanitas aut extitisse aut non vindicata esse videatur. Praetermitto ruinas fortunarum tuarum, quas omnis inpendere tibi proxumis Idibus senties; ad illa venio, quae non ad privatam ignominiam vitiorum tuorum, non ad domesticam tuam difficultatem ac turpitudinem sed ad summam rem publicam atque ad omnium nostrum vitam salutemque pertinent. [15] Potestne tibi haec lux, Catilina, aut huius caeli spiritus esse iucundus, cum scias esse horum neminem, qui nesciat te pridie Kalendas Ianuarias Lepido et Tullo consulibus stetisse in comitio cum telo, manum consulum et principum civitatis interficiendorum causa paravisse, sceleri ac furori tuo non mentem aliquam aut timorem tuum sed fortunam populi Romani obstitisse?

Ac iam illa omitto--neque enim sunt aut obscura aut non multa commissa postea--quotiens tu me designatum, quotiens consulem interficere conatus es! quot ego tuas petitiones ita coniectas, ut vitari posse non viderentur, parva quadam declinatione et, ut aiunt, corpore effugi! nihil [agis, nihil] adsequeris [, nihil moliris] neque tamen conari ac velle desistis. [16] Quotiens tibi iam extorta est ista sica de manibus, quotiens [vero] excidit casu aliquo et elapsa est! [tamen ea carere diutius non potes] quae quidem quibus abs te initiata sacris ac devota sit, nescio, quod eam necesse putas esse in consulis corpore defigere.

VII. Nunc vero quae tua est ista vita? Sic enim iam tecum loquar, non ut odio permotus esse videar, quo debeo, sed ut misericordia, quae tibi nulla debetur. Venisti paulo ante in senatum. Quis te ex hac tanta frequentia totque tuis amicis ac necessariis salutavit? Si hoc post hominum memoriam contigit nemini, vocis expectas contumeliam, cum sis gravissimo iudicio taciturnitatis oppressus? Quid, quod adventu tuo ista subsellia vacuefacta sunt, quod omnes consulares, qui tibi persaepe ad caedem constituti fuerunt, simul atque adsedisti, partem istam subselliorum nudam atque inanem reliquerunt, quo tandem animo [hoc] tibi ferundum putas?

[17] Servi mehercule mei si me isto pacto metuerent, ut te metuunt omnes cives tui, domum meam relinquendam putarem; tu tibi urbem non arbitraris? et, si me meis civibus iniuria suspectum tam graviter atque offensum viderem, carere me aspectu civium quam infestis omnium oculis conspici mallem; tu cum conscientia scelerum tuorum agnoscas odium omnium iustum et iam diu tibi debitum, dubitas, quorum mentes sensusque volneras, eorum aspectum praesentiamque vitare? Si te parentes timerent atque odissent tui neque eos ulla ratione placare posses, ut opinor, ab eorum oculis aliquo concederes. Nunc te patria, quae communis est parens omnium nostrum, odit ac metuit et iam diu nihil te iudicat nisi de parricidio suo cogitare; huius tu neque auctoritatem verebere nec iudicium sequere nec vim pertimesces?

[18] Quae tecum, Catilina, sic agit et quodam modo tacita loquitur: "Nullum iam aliquot annis facinus exstitit nisi per te, nullum flagitium sine te; tibi uni multorum civium neces, tibi vexatio direptioque sociorum inpunita fuit ac libera; tu non solum ad neglegendas leges et quaestiones, verum etiam ad evertendas perfringendasque valuisti. Superiora illa, quamquam ferenda non fuerunt, tamen, ut potui, tuli; nunc vero me totam esse in metu propter unum te, quicquid increpuerit, Catilinam timeri, nullum videri contra me consilium iniri posse, quod a tuo scelere abhorreat, non est ferendum. Quam ob rem discede atque hunc mihi timorem eripe; si est verus, ne opprimar, sin falsus, ut tandem aliquando timere desinam."

[19] VIII. Haec si tecum, ita ut dixi, patria loquatur, nonne impetrare debeat, etiamsi vim adhibere non possit? Quid, quod tu te ipse in custodiam dedisti, quod vitandae suspicionis causa ad M'. Lepidum te habitare velle dixisti? A quo non receptus etiam ad me venire ausus es atque, ut domi meae te adservarem, rogasti. Cum a me quoque id responsum tulisses, me nullo modo posse isdem parietibus tuto esse tecum, qui magno in periculo essem, quod isdem moenibus contineremur, ad Q. Metellum praetorem venisti. A quo repudiatus ad sodalem tuum, virum optumum, M. Metellum, demigrasti; quem tu videlicet et ad custodiendum diligentissimum et ad suspicandum sagacissimum et ad vindicandum fortissimum fore putasti. Sed quam longe videtur a carcere atque a vinculis abesse debere, qui se ipse iam dignum custodia iudicarit!

[20] Quae cum ita sint, Catilina, dubitas, si emori aequo animo non potes, abire in aliquas terras et vitam istam multis suppliciis iustis debitisque ereptam fugae solitudinique mandare? "Refer" inquis "ad senatum"; id enim postulas et, si hic ordo [sibi] placere decreverit te ire in exilium, optemperaturum te esse dicis. Non referam, id quod abhorret a meis moribus, et tamen faciam, ut intellegas, quid hi de te sentiant. Egredere ex urbe, Catilina, libera rem publicam metu, in exilium, si hanc vocem exspectas, proficiscere. Quid est, Catilina? ecquid attendis, ecquid animadvertis horum silentium? Patiuntur, tacent. Quid exspectas auctoritatem loquentium, quorum voluntatem tacitorum perspicis?

[21] At si hoc idem huic adulescenti optimo, P. Sestio, si fortissimo viro, M. Marcello, dixissem, iam mihi consuli hoc ipso in templo iure optimo senatus vim et manus intulisset. De te autem, Catilina, cum quiescunt, probant, cum patiuntur, decernunt, cum tacent, clamant, neque hi solum, quorum tibi auctoritas est videlicet cara, vita vilissima, sed etiam illi equites Romani, honestissimi atque optimi viri, ceterique fortissimi cives, qui circumstant senatum, quorum tu et frequentiam videre et studia perspicere et voces paulo ante exaudire potuisti. Quorum ego vix abs te iam diu manus ac tela contineo, eosdem facile adducam, ut te haec, quae vastare iam pridem studes, relinquentem usque ad portas prosequantur.

[22] IX. Quamquam quid loquor? te ut ulla res frangat, tu ut umquam te corrigas, tu ut ullam fugam meditere, tu ut ullum exilium cogites? Utinam tibi istam mentem di inmortales duint! tametsi video, si mea voce perterritus ire in exilium animum induxeris quanta tempestas invidiae nobis, si minus in praesens tempus recenti memoria scelerum tuorum, at in posteritatem impendeat. Sed est tanti, dum modo ista sit privata calamitas et a rei publicae periculis seiungatur. Sed tu ut vitiis tuis commoveare, ut legum poenas pertimescas, ut temporibus rei publicae cedas, non est postulandum. Neque enim is es, Catilina, ut te aut pudor umquam a turpitudine aut metus a periculo aut ratio a furore revocarit.

[23] Quam ob rem, ut saepe iam dixi, proficiscere ac, si mihi inimico, ut praedicas, tuo conflare vis invidiam, recta perge in exilium; vix feram sermones hominum, si id feceris, vix molem istius invidiae, si in exilium iussu consulis ieris, sustinebo. Sin autem servire meae laudi et gloriae mavis, egredere cum inportuna sceleratorum manu, confer te ad Manlium, concita perditos cives, secerne te a bonis, infer patriae bellum, exsulta impio latrocinio, ut a me non eiectus ad alienos, sed invitatus ad tuos isse videaris.

[24] Quamquam quid ego te invitem, a quo iam sciam esse praemissos, qui tibi ad Forum Aurelium praestolarentur armati, cui iam sciam pactam et constitutam cum Manlio diem, a quo etiam aquilam illam argenteam, quam tibi ac tuis omnibus confido perniciosam ac funestam futuram, cui domi tuae sacrarium [scelerum tuorum] constitutum fuit, sciam esse praemissam? Tu ut illa carere diutius possis, quam venerari ad caedem proficiscens solebas, a cuius altaribus saepe istam impiam dexteram ad necem civium transtulisti?

[25] X. Ibis tandem aliquando, quo te iam pridem ista tua cupiditas effrenata ac furiosa rapiebat; neque enim tibi haec res adfert dolorem, sed quandam incredibilem voluptatem. Ad hanc te amentiam natura peperit, voluntas exercuit, fortuna servavit. Numquam tu non modo otium, sed ne bellum quidem nisi nefarium concupisti. Nactus es ex perditis atque ab omni non modo fortuna, verum etiam spe derelictis conflatam inproborum manum. [26] Hic tu qua laetitia perfruere, quibus gaudiis exultabis, quanta in voluptate bacchabere, cum in tanto numero tuorum neque audies virum bonum quemquam neque videbis! Ad huius vitae studium meditati illi sunt, qui feruntur, labores tui, iacere humi non solum ad obsidendum stuprum, verum etiam ad facinus obeundum, vigilare non solum insidiantem somno maritorum, verum etiam bonis otiosorum. Habes, ubi ostentes tuam illam praeclaram patientiam famis, frigoris, inopiae rerum omnium, quibus te brevi tempore confectum esse senties. [27] Tantum profeci tum, cum te a consulatu reppuli, ut exsul potius temptare quam consul vexare rem publicam posses, atque ut id, quod esset a te scelerate susceptum, latrocinium potius quam bellum nominaretur.

XI. Nunc, ut a me, patres conscripti, quandam prope iustam patriae querimoniam detester ac deprecer, percipite, quaeso, diligenter, quae dicam, et ea penitus animis vestris mentibusque mandate. Etenim, si mecum patria, quae mihi vita mea multo est carior, si cuncta Italia, si omnis res publica loquatur:

"M.Tulli, quid agis? Tune eum, quem esse hostem comperisti, quem ducem belli futurum vides, quem expectari imperatorem in castris hostium sentis, auctorem sceleris, principem coniurationis, evocatorem servorum et civium perditorum, exire patiere, ut abs te non emissus ex urbe, sed immissus in urbem esse videatur? Nonne hunc in vincla duci, non ad mortem rapi, non summo supplicio mactari imperabis? [28] Quid tandem te impedit? mosne maiorum? At persaepe etiam privati in hac re publica perniciosos cives morte multarunt. An leges, quae de civium Romanorum supplicio rogatae sunt? At numquam in hac urbe, qui a re publica defecerunt, civium iura tenuerunt. An invidiam posteritatis times? Praeclaram vero populo Romano refers gratiam, qui te, hominem per te cognitum nulla commendatione maiorum tam mature ad summum imperium per omnis honorum gradus extulit, si propter invidiam aut alicuius periculi metum salutem civium tuorum neglegis. [29] Sed, si quis est invidiae metus, non est vehementius severitatis ac fortitudinis invidia quam inertiae ac nequitiae pertimescenda. An, cum bello vastabitur Italia, vexabuntur urbes, tecta ardebunt tum te non existumas invidiae incendio conflagraturum?"

XII. His ego sanctissimis rei publicae vocibus et eorum hominum, qui hoc idem sentiunt, mentibus pauca respondebo. Ego si hoc optimum factu iudicarem, patres conscripti, Catilinam morte multari, unius usuram horae gladiatori isti ad vivendum non dedissem. Etenim si summi viri et clarissimi cives saturnini et Gracchorum et Flacci et superiorum complurium sanguine non modo se non contaminarunt, sed etiam honestarunt, certe verendum mihi non erat, ne quid hoc parricida civium interfecto invidiae [mihi] in posteritatem redundaret. Quodsi ea mihi maxime inpenderet tamen hoc animo fui semper, ut invidiam virtute partam gloriam, non invidiam putarem.

[30] Quamquam non nulli sunt in hoc ordine, qui aut ea, quae inminent non videant aut ea, quae vident, dissimulent; qui spem Catilinae mollibus sententiis aluerunt coniurationemque nascentem non credendo corroboraverunt; quorum auctoritate multi non solum improbi, verum etiam inperiti, si in hunc animadvertissem, crudeliter et regie factum esse dicerent. Nunc intellego, si iste, quo intendit, in Manliana castra pervenerit, neminem tam stultum fore, qui non videat coniurationem esse factam neminem tam improbum, qui non fateatur. Hoc autem uno interfecto intellego hanc rei publicae pestem paulisper reprimi, non in perpetuum comprimi posse. Quodsi se eiecerit secumque suos eduxerit et eodem ceteros undique collectos naufragos adgregarit, extinguetur atque delebitur non modo haec tam adulta rei publicae pestis, verum etiam stirps ac semen malorum omnium.

[31] Etenim iam diu, patres conscripti, in his periculis coniurationis insidiisque versamur, sed nescio quo pacto omnium scelerum ac veteris furoris et audaciae maturitas in nostri consulatus tempus erupit. Quodsi ex tanto latrocinio iste unus tolletur, videbimur fortasse ad breve quoddam tempus cura et metu esse relevati, periculum autem residebit et erit inclusum penitus in venis atque in visceribus rei publicae. Ut saepe homines aegri morbo gravi cum aestu febrique iactantur, si aquam gelidam biberunt, primo relevari videntur, deinde multo gravius vehementiusque adflictantur, sic hic morbus, qui est in re publica, relevatus istius poena vehementius reliquis vivis ingravescet.

[32] Quare secedant inprobi, secernant se a bonis, unum in locum congregentur, muro denique, [id] quod saepe iam dixi, secernantur a nobis; desinant insidiari domi suae consuli, circumstare tribunal praetoris urbani, obsidere cum gladiis curiam, malleolos et faces ad inflammandam urbem comparare; sit denique inscriptum in fronte unius cuiusque, quid de re publica sentiat. Polliceor hoc vobis, patres conscripti, tantam in nobis consulibus fore diligentiam, tantam in vobis auctoritatem, tantam in equitibus Romanis virtutem, tantam in omnibus bonis consensionem, ut Catilinae profectione omnia patefacta, inlustrata, oppressa, vindicata esse videatis.

[33] Hisce ominibus, Catilina, cum summa rei publicae salute, cum tua peste ac pernicie cumque eorum exitio, qui se tecum omni scelere parricidioque iunxerunt, proficiscere ad impium bellum ac nefarium. Tu, Iuppiter, qui isdem quibus haec urbs auspiciis a Romulo es constitutus, quem Statorem huius urbis atque imperii vere nominamus, hunc et huius socios a tuis [aris] ceterisque templis, a tectis urbis ac moenibus, a vita fortunisque civium [omnium] arcebis et homines bonorum inimicos, hostis patriae, latrones Italiae scelerum foedere inter se ac nefaria societate coniunctos aeternis suppliciis vivos mortuosque mactabis.

Cicero The Latin Library The Classics Page