WordCount countWords(const QString &file)
{
QFile f(file);
f.open(QIODevice::ReadOnly);
QTextStream textStream(&f);
WordCount wordCount;
while (textStream.atEnd() == false)
foreach (QString word, textStream.readLine().split(" "))
wordCount[word] += 1;
return wordCount;
}
...
QStringList files = findFiles("../../", QStringList() << "*.cpp" << "*.h");
...
int mapReduceTime = 0;
{
QTime time;
time.start();
WordCount total = mappedReduced(files, countWords, reduce);
mapReduceTime = time.elapsed();
qDebug() << "MapReduce" << mapReduceTime;
}
假设我想跟踪我正在处理哪个文件,我可以创建一个全局静态变量,并在每次开始运行时递增它,在countWord函数内部知道我正在对文件进行一些处理1号?或者是否无法知道将首先处理哪些文件?我问,因为mapreduce允许并行处理,但我不知道操作系统将如何安排线程。
答案 0 :(得分:0)
不可能准确地知道处理的顺序是什么,因为每个映射操作通常会花费不同的时间。
一个简单的解决方案是不处理原始文件列表,而是处理(索引,文件名)对的列表。
您还应该跳过空字符串,并至少处理打开给定文件以进行读取的失败。写作boolExpr == false
的惯用方法只是! boolExpr
。
typedef QPair<int, QString> FileEntry;
WordCount countWords(const FileEntry &entry)
{
WordCount wordCount;
QFile f(entry.second);
if (!f.open(QIODevice::ReadOnly)) return wordCount;
QTextStream ts(&f);
while (!ts())
foreach (QString word, ts().split(" ", QString::SkipEmptyParts))
wordCount[word] ++;
return wordCount;
}
QStringList f = findFiles("../../", QStringList() << "*.cpp" << "*.h");
QList<FileEntry> fileEntries;
fileEntries.reserve(f.size());
int i = 0;
foreach (QString file, f)
fileEntries << qMakePair(i++, file);
mappedReduced(fileEntries, countWords, reduce);