这是我问题最接近的问题,并没有真正得到很好的回答:
我正在寻找#1的答案:
你要做多少次请求/秒?
现在我从链接队列中拉出来.每个被抓取的网站都有自己的线程,在请求之间休眠1秒钟.我要求gzip压缩以节省带宽.
有这个标准吗?当然,所有大型搜索引擎都有一些关于此的指导方针.
在过去的一年里,我一直在解析扑克手的历史,并且总体上已经学会了很多关于解析的知识.
我们从正则表达式开始,但很快意识到这不容易扩展.我们跳过了从ruby到c ++的语言,最后发现它是必须改变的算法.
我们选择了Boost :: Spirit并观察我们的速度在我们原始速度的10倍以上的订单上急剧上升.然后我们跳过java并且正在使用antlr为每个站点创建语法.这绝对是迄今为止最快的方法,它非常彻底,因为你确切地知道你在"完整"语法方面的立场.不幸的是,我花费了大量的时间来处理这些语法 - 它们的工作非常好,但还不完美.
无论如何,对于手头的问题有足够的背景 - 是否有任何"异国情调"或不太知名的解析技术,我不知道?我只知道lexing /解析语法和其他低级正则表达式/循环方法.
对于那些不熟悉扑克手历史的人,我会发布一个,这样你就能分辨出结构是什么.
Full Tilt Poker Game #12037626529: Table durrrr (heads up, deep) - $500/$1000 -
Pot Limit Omaha Hi - 2:00:48 ET - 2009/05/05
Seat 1: durrrr ($196,456.50)
Seat 2: Gus Hansen ($65,499)
durrrr posts the small blind of $500
Gus Hansen posts the big blind of $1,000
The button is in seat #1
*** HOLE CARDS ***
durrrr raises to $3,000
Gus Hansen raises to $9,000
durrrr calls …Run Code Online (Sandbox Code Playgroud) 我最近一直在评估大型键值存储,我不断遇到术语“读取修复”,但不知道他们在说什么。我认为这与交易有关,但我不确定。
有人可以解释一下它是什么以及它与传统数据库的工作方式有何不同?也许提供一些伪代码来帮助解释?
所以,我发现并且目前正在使用Stanford Parser,它可以很好地分割句子.我们的大多数句子来自AP,所以它对这项任务非常有效.
这是问题所在:
为此,我已经编写了多个补丁来补偿我真正不应该做的事情.
基本上它正处于使用开始时分裂句子的问题同样多的障碍.
我还有什么其他选择?任何其他NLP类型的框架可能有帮助吗?
我最初的问题是能够以高概率检测句子边缘.
我们的服务器上有严重的延迟问题.
我们在S3中存储了3个感兴趣的东西,并将它们存入memcache.
到目前为止,我们已经为memcached提供了128meg的ram ......截至目前它正在使用74兆的内存
做一些基本的数学我们应该能够轻松地拥有大约30,000个文本文档(使用它们的xml表示)和1,000个用户头像,并且仍然在我们的128meg专用于memcache
现在我们有大约100个用户头像可以在我们拥有的数十万个文本/ xml文档中的任何给定时间被提取但是它们不会像头像一样被查看...它就是这里的一个,在那里类型事情
有时白天用户头像加载速度超慢(表示必须从s3加载)和其他时间(当然加载后),你可以告诉他们是从memcached提供的; 与文本文件相同的东西
我们在REE的apache下运行merb.我们正在使用基于libmemcached-0.25.14构建的evan weaver的memcached gem(我完全理解它不是最新的lib;这个gem需要它)
从我所看到的我们的延迟问题是因为S3确实存在严重的延迟问题(对于单个虚拟形象有时候是500毫秒).但是,考虑到应该一直缓存它似乎不应该是一个问题.缓存的默认到期时间设置为1周.
相关代码是:
@cache = MMCACHE.clone
begin
picture = @cache.get("/avatars/#{user.avatar}")
rescue
picture = user.picture
@cache.set("/avatars/#{user.avatar}", picture)
end
@cache.quit
Run Code Online (Sandbox Code Playgroud)
克隆/退出很重要,因为在apache/phusion中,当它分叉时会有共享连接的问题,如果我们没有关闭我们的连接,它们会一直存在,直到我们用完文件描述符.
我开始密切关注内存缓存,看看我是否可以追踪我的问题,但有任何建议吗?我们应该摆脱S3 ??
我知道问题标题不是最好的.让我解释.
我做了一个文本处理TON,它将自然语言转换为xml.这些文本文件上传得相当快,并被扔进队列中.从那里将它们逐个拉到后台工作器中,后者调用我们的解析器(使用boost spirit)将文本转换为xml并将相关部分加载到我们的数据库中.
解析器一次可以执行大约100个这样的操作.我在后台工作者上有速率限制器,现在每隔一段时间只轮询我们的队列,所以它的执行速度不是很快.我现在不能抛弃多个后台工作者,因为我的http请求开始掉线 - 后台工作者和网络服务器存在于同一台机器上,我相信这是因为cpu使用率达到80-95%,尽管我们也可以使用更多的ram.
我需要更好地扩展它.你会怎么做呢?
在几个问题的答案:
我们使用亚马逊网络服务,所以购买便宜的额外硬件与产生一个新的亚马逊实例有点不同 - 也许有人做了一些自动生成负载量实例的代码?
我们有一个http服务器,只是将我们的文件填入队列,所以它受影响的唯一原因是因为cpu忙着处理大量的解析相关的东西
虽然我们没有在解析器本身中使用它,但我已经对后台工作者进行了速率限制
我还没有尝试过,但我过去曾经使用它 - 我需要写下一些基准
解析器完全独立于Web服务器 - 我们将nginx/merb作为我们的Web /应用程序服务器,并将一个rake任务调用c ++作为我们的后台工作者 - 但它们确实存在于同一台机器上
我有9种不同的语法.其中一个将被加载,具体取决于它正在解析的文件的第一行txt.
我正在考虑将词法分析器/解析器派生到sep中.类,然后在我得到匹配时立即实例化它们 - 不确定这是否会减慢我的速度但不会.我想一些基准测试是有序的.
真的,速度绝对是我的目标,但我知道这是丑陋的代码.
现在代码看起来像这样:
sin.mark(0)
site = findsite(txt)
sin.reset()
if ( site == "site1") {
loadlexer1;
loadparser1;
} else if (site == "site2") {
loadlexer2;
loadparser2;
}
.................
} else if (site == "site8") {
loadparser8;
loadparser8;
}
findsite(txt) {
...................
if line.indexOf("site1-identifier") {
site = site1;
} else if(line.indexOf("site2-identifier") {
site = site2;
} else if(line.indexOf("site3-identifier") {
site = site3;
}
.........................
} else if(line.indexOf("site8-identifier") {
site = site8;
}
}
Run Code Online (Sandbox Code Playgroud)
一些澄清
1)是的,我真的有9个不同的语法,我用antlr构建,所以他们将拥有自己的词法分析器/解析器objs.
2)是的,截至目前我们正在比较字符串,并且显然将用某种整数映射替换.我也考虑过将网站标识符粘贴到一个正则表达式中,但是我不认为这会加快任何速度.
3)是的,这是伪代码所以我不会对这里的语义过于挑剔.. …
我有一个文件监视器,它正在从使用utf-16LE编码的不断增长的文件中获取内容.写入它的第一位数据有BOM可用 - 我用它来识别UTF-8的编码(我的文件的MOST编码在其中).我抓住了BOM并重新编码为UTF-8,所以我的解析器并没有吓坏.问题是,由于它是一个不断增长的文件,并不是每一位数据都有BOM.
这是我的问题 - 没有将BOM字节添加到我拥有的每组数据(因为我没有对源的控制)我可以只查找UTF-16\000中固有的空字节,然后使用那作为我的标识符而不是BOM?这会让我头疼吗?
我的架构涉及一个ruby Web应用程序,当我用java编写的解析器拾取它时,将收到的数据记录到一个临时文件中.
现在写我的识别/重新编码代码如下所示:
// guess encoding if utf-16 then
// convert to UTF-8 first
try {
FileInputStream fis = new FileInputStream(args[args.length-1]);
byte[] contents = new byte[fis.available()];
fis.read(contents, 0, contents.length);
if ( (contents[0] == (byte)0xFF) && (contents[1] == (byte)0xFE) ) {
String asString = new String(contents, "UTF-16");
byte[] newBytes = asString.getBytes("UTF8");
FileOutputStream fos = new FileOutputStream(args[args.length-1]);
fos.write(newBytes);
fos.close();
}
fis.close();
} catch(Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
我想支持诸如欧元,em-dashes和其他角色之类的东西.我修改了上面的代码看起来像这样,它似乎传递了我对这些字符的所有测试:
// guess encoding if utf-16 …Run Code Online (Sandbox Code Playgroud)