由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问一道airbnb的面试题
相关主题
google 面试题一道面试题
一道count frequency of all words的面试题算法面试题
面试题求解贡献一道twitter的面试题
Glassdoor上面看到一道F家最近的面试题,来讨论一下?onsite面试题一道
问个事,这样的面试题难么?面试题
Informatica谁有过这家公司的面试?面试题请教:一个矩阵,里面的值是0或1,找出最大子矩阵,此子矩阵的值全为1
一道C面试题求software development engineer in big data (A9)面试题范围
大家看看这几道google面试题怎么做?G面试题求解
相关话题的讨论汇总
话题: beg话题: string话题: merge话题: map话题: 内存
进入JobHunting版参与讨论
1 (共1页)
b*********n
发帖数: 1258
1
关于下面贴的这道面试题
当文件巨大,所有unique的单词不足以装到内存里面,
如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
如果要实现external merge sort, 感觉 复杂度就上来了
请问还有什么更好的办法吗?
====== 面试题 ======
coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
,然后反复这样做最终得到最后结果。
T****U
发帖数: 3344
2
给单词编码可以省不少空间,external merge sort也没什么麻烦的,只要是按字母排
序的
a*****u
发帖数: 1712
3
就是external merge的思路

关于下面贴的这道面试题当文件巨大,所有unique的单词不足以装到内存里面,如果分
batch来处理,在merge的时候,内存也还是装不下,怎么办?如果要实现external m..
......

【在 b*********n 的大作中提到】
: 关于下面贴的这道面试题
: 当文件巨大,所有unique的单词不足以装到内存里面,
: 如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
: 如果要实现external merge sort, 感觉 复杂度就上来了
: 请问还有什么更好的办法吗?
: ====== 面试题 ======
: coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
: 存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
: ,然后反复这样做最终得到最后结果。

r**********g
发帖数: 22734
4
难道不用Hadoop/spark?

【在 b*********n 的大作中提到】
: 关于下面贴的这道面试题
: 当文件巨大,所有unique的单词不足以装到内存里面,
: 如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
: 如果要实现external merge sort, 感觉 复杂度就上来了
: 请问还有什么更好的办法吗?
: ====== 面试题 ======
: coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
: 存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
: ,然后反复这样做最终得到最后结果。

r**********g
发帖数: 22734
5
为啥要sort?只要grouping 就行了。标准的Hadoop 101

..

【在 a*****u 的大作中提到】
: 就是external merge的思路
:
: 关于下面贴的这道面试题当文件巨大,所有unique的单词不足以装到内存里面,如果分
: batch来处理,在merge的时候,内存也还是装不下,怎么办?如果要实现external m..
: ......

t**r
发帖数: 3428
6
hadoop mapreduce.
b*********n
发帖数: 1258
7
可是,要求现场编译运行
没办法跑Hadoop Job
b**********5
发帖数: 7881
8
你自己可以在MAC上install hadoop, 然后run pig

【在 b*********n 的大作中提到】
: 可是,要求现场编译运行
: 没办法跑Hadoop Job

s********d
发帖数: 36
9
trie?
r**********g
发帖数: 22734
10
当场运行就是
cat f | awk '{for(i=1;i<=NF;i++) print $i}' | sort -T 2G | uniq -c
你写完程序,oneliner 说不定已经跑完了

【在 b*********n 的大作中提到】
: 关于下面贴的这道面试题
: 当文件巨大,所有unique的单词不足以装到内存里面,
: 如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
: 如果要实现external merge sort, 感觉 复杂度就上来了
: 请问还有什么更好的办法吗?
: ====== 面试题 ======
: coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
: 存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
: ,然后反复这样做最终得到最后结果。

相关主题
Informatica谁有过这家公司的面试?一道面试题
一道C面试题算法面试题
大家看看这几道google面试题怎么做?贡献一道twitter的面试题
进入JobHunting版参与讨论
l*n
发帖数: 529
11
像是实现个mapreduce。merge时内存装不下的话,每次batch都用hash partition一下
,再merge每个partition应该就没啥压力了。

【在 b*********n 的大作中提到】
: 关于下面贴的这道面试题
: 当文件巨大,所有unique的单词不足以装到内存里面,
: 如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
: 如果要实现external merge sort, 感觉 复杂度就上来了
: 请问还有什么更好的办法吗?
: ====== 面试题 ======
: coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
: 存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
: ,然后反复这样做最终得到最后结果。

c*****y
发帖数: 62
12
什么时候的题?
正解是什么呢?

【在 b*********n 的大作中提到】
: 关于下面贴的这道面试题
: 当文件巨大,所有unique的单词不足以装到内存里面,
: 如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
: 如果要实现external merge sort, 感觉 复杂度就上来了
: 请问还有什么更好的办法吗?
: ====== 面试题 ======
: coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
: 存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
: ,然后反复这样做最终得到最后结果。

k******a
发帖数: 44
13
题目没有说,但是总体是要求统计词频吧
可不可以这样,
先分块,每块都能够用现有内存出,统计词频,按照字母排序,输出到一个文件。
然后中间文件两两合并,合并的时候边读边写,比如A,B,相当于磁头,读入数据A,B,
如果是同一个单词的,合并结果输出,如果不同先输出字母顺序小得,再输出大得,继
续。。 这个过程用不了多少内存
可能思路上还是外部排序。
b*********n
发帖数: 1258
14
关于下面贴的这道面试题
当文件巨大,所有unique的单词不足以装到内存里面,
如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
如果要实现external merge sort, 感觉 复杂度就上来了
请问还有什么更好的办法吗?
====== 面试题 ======
coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
,然后反复这样做最终得到最后结果。
T****U
发帖数: 3344
15
给单词编码可以省不少空间,external merge sort也没什么麻烦的,只要是按字母排
序的
a*****u
发帖数: 1712
16
就是external merge的思路

关于下面贴的这道面试题当文件巨大,所有unique的单词不足以装到内存里面,如果分
batch来处理,在merge的时候,内存也还是装不下,怎么办?如果要实现external m..
......

【在 b*********n 的大作中提到】
: 关于下面贴的这道面试题
: 当文件巨大,所有unique的单词不足以装到内存里面,
: 如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
: 如果要实现external merge sort, 感觉 复杂度就上来了
: 请问还有什么更好的办法吗?
: ====== 面试题 ======
: coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
: 存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
: ,然后反复这样做最终得到最后结果。

r**********g
发帖数: 22734
17
难道不用Hadoop/spark?

【在 b*********n 的大作中提到】
: 关于下面贴的这道面试题
: 当文件巨大,所有unique的单词不足以装到内存里面,
: 如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
: 如果要实现external merge sort, 感觉 复杂度就上来了
: 请问还有什么更好的办法吗?
: ====== 面试题 ======
: coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
: 存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
: ,然后反复这样做最终得到最后结果。

r**********g
发帖数: 22734
18
为啥要sort?只要grouping 就行了。标准的Hadoop 101

..

【在 a*****u 的大作中提到】
: 就是external merge的思路
:
: 关于下面贴的这道面试题当文件巨大,所有unique的单词不足以装到内存里面,如果分
: batch来处理,在merge的时候,内存也还是装不下,怎么办?如果要实现external m..
: ......

t**r
发帖数: 3428
19
hadoop mapreduce.
b*********n
发帖数: 1258
20
可是,要求现场编译运行
没办法跑Hadoop Job
相关主题
onsite面试题一道求software development engineer in big data (A9)面试题范围
面试题G面试题求解
面试题请教:一个矩阵,里面的值是0或1,找出最大子矩阵,此子矩阵的值全为1【活动+猎头+内推】大数据男神进阶全攻略 – 对话来自Apple和M
进入JobHunting版参与讨论
b**********5
发帖数: 7881
21
你自己可以在MAC上install hadoop, 然后run pig

【在 b*********n 的大作中提到】
: 可是,要求现场编译运行
: 没办法跑Hadoop Job

s********d
发帖数: 36
22
trie?
r**********g
发帖数: 22734
23
当场运行就是
cat f | awk '{for(i=1;i<=NF;i++) print $i}' | sort -T 2G | uniq -c
你写完程序,oneliner 说不定已经跑完了

【在 b*********n 的大作中提到】
: 关于下面贴的这道面试题
: 当文件巨大,所有unique的单词不足以装到内存里面,
: 如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
: 如果要实现external merge sort, 感觉 复杂度就上来了
: 请问还有什么更好的办法吗?
: ====== 面试题 ======
: coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
: 存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
: ,然后反复这样做最终得到最后结果。

l*n
发帖数: 529
24
像是实现个mapreduce。merge时内存装不下的话,每次batch都用hash partition一下
,再merge每个partition应该就没啥压力了。

【在 b*********n 的大作中提到】
: 关于下面贴的这道面试题
: 当文件巨大,所有unique的单词不足以装到内存里面,
: 如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
: 如果要实现external merge sort, 感觉 复杂度就上来了
: 请问还有什么更好的办法吗?
: ====== 面试题 ======
: coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
: 存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
: ,然后反复这样做最终得到最后结果。

c*****y
发帖数: 62
25
什么时候的题?
正解是什么呢?

【在 b*********n 的大作中提到】
: 关于下面贴的这道面试题
: 当文件巨大,所有unique的单词不足以装到内存里面,
: 如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
: 如果要实现external merge sort, 感觉 复杂度就上来了
: 请问还有什么更好的办法吗?
: ====== 面试题 ======
: coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
: 存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
: ,然后反复这样做最终得到最后结果。

k******a
发帖数: 44
26
题目没有说,但是总体是要求统计词频吧
可不可以这样,
先分块,每块都能够用现有内存出,统计词频,按照字母排序,输出到一个文件。
然后中间文件两两合并,合并的时候边读边写,比如A,B,相当于磁头,读入数据A,B,
如果是同一个单词的,合并结果输出,如果不同先输出字母顺序小得,再输出大得,继
续。。 这个过程用不了多少内存
可能思路上还是外部排序。
l**h
发帖数: 893
27
这样做如何:在内存里面开N个HashMap, 用来计数。每读到一个词语,做一个hash, 看
应该用哪个HashMap。 任何一个HashMap的size大于某个值的时候,就把里面的结果写
到磁盘,然后HashMap清零。磁盘上面有N个文件。要查任何一个词语的词频,就算一下
Hash, 然后找到对应的文件去查。
其实思想就是map reduce.

【在 b*********n 的大作中提到】
: 关于下面贴的这道面试题
: 当文件巨大,所有unique的单词不足以装到内存里面,
: 如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
: 如果要实现external merge sort, 感觉 复杂度就上来了
: 请问还有什么更好的办法吗?
: ====== 面试题 ======
: coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
: 存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
: ,然后反复这样做最终得到最后结果。

x*******1
发帖数: 28835
28
f 有1个PBytes, 怎么cat?

【在 r**********g 的大作中提到】
: 当场运行就是
: cat f | awk '{for(i=1;i<=NF;i++) print $i}' | sort -T 2G | uniq -c
: 你写完程序,oneliner 说不定已经跑完了

f*******r
发帖数: 976
29
题目就是external sort的思想。统计单词的次数,明显用map。注意文
件很大,要用long,以免溢出。
在你读文件并且增加这个map时,内存不够用,这是你要把临时结果写入临时文件。你
可以设计一个threshold,比如1 billion,当map的size达到这个值时,你就把map和临
时文件merge到另一个临时文件里。最后再把这个文件rename到原来的临时文件。再把
map清空,继续读原文件直到结束。 C++代码如下:
// Split the string into words that consists of a..z and A..Z.
void split(const string &s, vector &res) {
int beg = -1;
for (int i = 0, e = s.size(); i < e; ++i) {
if ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')) {
if (beg == -1) beg = i;
} else {
if (beg != -1) {
res.push_back(s.substr(beg, i-beg));
beg = -1;
}
}
}
if (beg != -1) res.push_back(s.substr(beg));
}
// split the string according to the delimiters.
void split(const string &s, vector &res, string delim) {
int beg = -1;
for (int i = 0, e = s.size(); i < e; ++i) {
if (delim.find(s[i]) == string::npos) {
if (beg == -1) beg = i;
} else {
if (beg != -1) {
res.push_back(s.substr(beg, i-beg));
beg = -1;
}
}
}
if (beg != -1) res.push_back(s.substr(beg));
}
// Merge the map with the counts in filename.
bool merge(const char *filename, map &m) {
ifstream in(filename);
ofstream os("tmp.txt");
if (!os.good()) return false;
string line;
map::const_iterator it = m.begin();
vector v;
getline(in, line);
split(line, v, ":");
while (in.good() && it != m.end()) {
if (v[0].compare((*it).first) == 0) {
os << v[0] << ":" << (atol(v[1].c_str()) + (*it).second) << "n";
getline(in, line);
v.resize(0);
split(line, v, ":");
++it;
} else if (v[0].compare((*it).first) < 0) {
os << v[0] << ":" << v[1] << "n";
getline(in, line);
v.resize(0);
split(line, v, ":");
} else {
os << (*it).first << ":" << (*it).second << "n";
++it;
}
}
// If there are still entries left in the map, write them to
// the new temporary file.
while (it != m.end()) {
os << (*it).first << ":" << (*it).second << "n";
++it;
}
// If the file is not finished, write the rest to the new temporary file.
while (in.good()) {
os << v[0] << ":" << v[1] << "n";
getline(in, line);
v.resize(0);
split(line, v, ":");
}
// close the temporary files.
in.close();
os.close();
m.clear();
// we rename the new temporary file back to the original temporary file.
if (rename("tmp.txt", filename) != 0) {
return false;
}
return true;
}
// Assume that there is not enough memory on the machine. We only store part
// of the final map in the memory and the rest is written into a temporary
file.
void writeBackToFile(const char *filename, const char *outfile) {
ifstream in(filename);
if (!in.good()) {
std::cerr << "Failed to open file " << filename << "n";
exit(1);
}
string s;
vector words;
map m;
while (in.good()) {
getline(in, s);
words.resize(0);
split(s, words);
for (int i = 0, e = words.size(); i < e; ++i) {
m[words[i]]++;
}
if (m.size() >= 10000) {
// Persist the data to the disk.
if (!merge(outfile, m)) {
std::cerr << "Error: " << __LINE__ << "n";
exit(1);
}
}
}
if (!merge(outfile, m)) {
std::cerr << "Errorn";
exit(1);
}
}

关于下面贴的这道面试题
当文件巨大,所有unique的单词不足以装到内存里面,
如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
如果要实现external merge sort, 感觉 复杂度就上来了
请问还有什么更好的办法吗?
====== 面试题 ======
coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
,然后反复这样做最终得到最后结果。

【在 b*********n 的大作中提到】
: 关于下面贴的这道面试题
: 当文件巨大,所有unique的单词不足以装到内存里面,
: 如果分batch来处理,在merge的时候,内存也还是装不下,怎么办?
: 如果要实现external merge sort, 感觉 复杂度就上来了
: 请问还有什么更好的办法吗?
: ====== 面试题 ======
: coding第一面让我实现一个词频统计,但是测试文件巨大,读啊读的不同的词就超了内
: 存了。结果面试官提醒我要注意存中间结果,所以是读一批,统计一批,然后写回文件
: ,然后反复这样做最终得到最后结果。

1 (共1页)
进入JobHunting版参与讨论
相关主题
G面试题求解问个事,这样的面试题难么?
【活动+猎头+内推】大数据男神进阶全攻略 – 对话来自Apple和MInformatica谁有过这家公司的面试?
问个大数据处理的面试题一道C面试题
请教一道FB的面试题大家看看这几道google面试题怎么做?
google 面试题一道面试题
一道count frequency of all words的面试题算法面试题
面试题求解贡献一道twitter的面试题
Glassdoor上面看到一道F家最近的面试题,来讨论一下?onsite面试题一道
相关话题的讨论汇总
话题: beg话题: string话题: merge话题: map话题: 内存