小编tol*_*uju的帖子

自动完成服务器端实现

在html输入框中为自动完成功能实现服务器端组件的快速有效方法是什么?

我正在编写一个服务,在我们的Web界面的主搜索框中自动完成用户查询,完成显示在ajax驱动的下拉列表中.我们运行查询的数据只是我们系统知道的大型概念表,大致与维基百科页面标题集相匹配.对于该服务,显然速度是最重要的,因为网页的响应性对于用户体验是重要的.

当前实现只是将所有概念加载到有序集合中的内存中,并对用户击键执行简单的log(n)查找.然后使用尾部提供超出最接近匹配的附加匹配.该解决方案的问题在于它无法扩展.它目前正在运行VM堆空间限制(我设置-Xmx2g,这是我们可以在32位计算机上推送的最多),这阻止我们扩展我们的概念表或添加更多功能.在具有更多内存的计算机上切换到64位VM不是一个直接的选择.

我一直犹豫是否开始研究基于磁盘的解决方案,因为我担心磁盘搜索时间会影响性能.是否存在可以让我更好地扩展的解决方案,无论是完全在内存中还是在一些快速磁盘支持的实现中?

编辑:

@Gandalf:对于我们的用例,重要的是自动完成是全面的,而不仅仅是对用户的额外帮助.至于我们正在完成的内容,它是概念类型对的列表.例如,可能的条目是[("Microsoft","Software Company"),("Jeff Atwood","Programmer"),("StackOverflow.com","Website")].一旦用户从自动完成列表中选择一个项目,我们就会使用Lucene进行完整搜索,但我还不确定Lucene是否可以自动完成自动完成.

@Glen:这里没有使用数据库.当我在谈论表时,我只是指数据的结构化表示.

@Jason Day:我对这个问题的原始实现是使用Trie,但由于需要大量的对象引用,因此内存膨胀实际上比排序集更差.我将阅读三元搜索树,看它是否有用.

java memory performance autocomplete

21
推荐指数
1
解决办法
1万
查看次数

语义Web框架

有哪些语义Web框架,每个框架的优点/缺点是什么?我已经广泛使用了耶拿,我简要地看了一下芝麻.还有其他我应该考虑的吗?

frameworks semantic-web

11
推荐指数
2
解决办法
3760
查看次数

解析维基媒体标记 - 基于EBNF的解析器是不是很适合?

我试图解析(在Java中)维基百科上的Wikiimedia标记.有许多现有的包用于此任务,但我没有发现任何特别适合我的需求.我使用过的最好的软件包是Mathclipse Bliki解析器,它在大多数页面上都做得不错.

但是,此解析器不完整,无法解析某些页面或无法正确解析其他页面.可悲的是,代码相当混乱,因此修复此解析引擎中的问题非常耗时且容易出错.

在尝试找到一个更好的解析引擎时,我已经研究过使用基于EBNF的解析器来完成这项任务(特别是ANTLR).经过一些尝试后,似乎这种方法并不特别适合这项任务,因为维基媒体标记相对宽松,因此不能轻易地融入结构化语法.

我对ANTLR和类似解析器的经验非常有限,因此可能是我的经验不足导致问题,而不是这样的解析器天生就不适合这项任务.任何对这些话题有更多经验的人都可以在这里说点吗?

@Stobor:我已经提到我已经查看了各种解析引擎,包括谷歌查询返回的引擎.到目前为止我发现的最好的是Bliki引擎.问题是修复这些解析器的问题变得非常繁琐,因为它们本质上都是条件和正则表达式的长链,导致意大利面条代码.我正在寻找更类似于EBNF解析方法的东西,因为该方法更清晰,更简洁,因此更容易理解和发展.我已经看过你发布的mediawiki链接,似乎证实了我怀疑开箱即用的EBNF不适合这个任务.因此,我正在寻找一个像EBNF一样清晰易懂的解析引擎,但也能够处理wiki标记的混乱语法.

java parsing antlr ebnf wikitext

9
推荐指数
1
解决办法
1318
查看次数

从线程模型转换为actor

试图了解如何用演员而不是线程来思考.我对以下用例感到有些困惑:

考虑一个系统,该系统具有创建工作的生产者流程(例如,通过从文件读取数据),以及消耗工作的许多工作流程(例如,通过解析数据并将其写入数据库).工作生产和消费的速度可能不同,系统应保持稳健.例如,如果工人无法跟上,生产者应该检测到这一点并最终减速或等待.

使用线程很容易实现:

val producer:Iterator[Work] = createProducer()
val queue = new LinkedBlockingQueue[Work](QUEUE_SIZE)
val workers = (0 until NUM_WORKERS) map { i =>
  new Thread() { 
    override def run() = {
      while (true) {
        try {
          // take next unit of work, waiting if necessary
          val work = queue.take()
          process(work)
        }
        catch {
          case e:InterruptedException => return
        }
      }
    }
  }
}

// start the workers
workers.foreach(_.start())

while (producer.hasNext) {
  val work = producer.next()
  // add new unit of work, waiting …
Run Code Online (Sandbox Code Playgroud)

concurrency refactoring scala actor

7
推荐指数
1
解决办法
513
查看次数

多部分gzip文件随机访问(Java)

这可能属于"不太可行"或"不值得付出努力"的范畴,但这里也是如此.

我正在尝试随机访问存储在多部分gzip文件中的记录.具体来说,我感兴趣的文件是压缩的Heretrix Arc文件.(如果您不熟悉多部分gzip文件,gzip规范允许在单个gzip文件中连接多个gzip流.它们不共享任何字典信息,它是简单的二进制附加.)

我认为应该可以通过寻找文件中的某个偏移来执行此操作,然后扫描gzip魔术头字节(即根据RFC的 0x1f8b ),并尝试从以下字节读取gzip流.这种方法的问题在于,那些相同的字节也可能出现在实际数据中,因此寻找这些字节会导致无效的位置开始从中读取gzip流.有没有更好的方法来处理随机访问,因为记录偏移不是先验已知的?

compression gzip multipart random-access

6
推荐指数
1
解决办法
2448
查看次数

在ANTLR中解析字符串插值

我正在研究一个简单的字符串操作DSL用于内部目的,我希望该语言支持字符串插值,因为它在Ruby中使用.

例如:

name = "Bob"
msg = "Hello ${name}!"
print(msg)   # prints "Hello Bob!"
Run Code Online (Sandbox Code Playgroud)

我正在尝试在ANTLRv3中实现我的解析器,但我对使用ANTLR缺乏经验,所以我不确定如何实现此功能.到目前为止,我已经在词法分析器中指定了我的字符串文字,但在这种情况下,我显然需要处理解析器中的插值内容.

我当前的字符串文字语法如下所示:

STRINGLITERAL : '"' ( StringEscapeSeq | ~( '\\' | '"' | '\r' | '\n' ) )* '"' ;
fragment StringEscapeSeq : '\\' ( 't' | 'n' | 'r' | '"' | '\\' | '$' | ('0'..'9')) ;
Run Code Online (Sandbox Code Playgroud)

将字符串文字处理移动到解析器中似乎使其他所有内容都停止工作.粗略的网络搜索没有提供任何信息.关于如何开始这个的任何建议?

parsing antlr string-interpolation

5
推荐指数
1
解决办法
5885
查看次数

调用内置的java本机方法

是否可以调用JVM的内置本机代码,即java.lang和java.io中各种类调用的代码?换句话说,您是否可以绕过内置的Java API来访问各种系统级调用,例如文件系统访问?我知道我可以通过构建我自己的本机代码库并通过JNI调用它来实现这一点,但是对于已经内置到JVM中的功能而言,不需要额外的本机库也是优雅的.

java java-native-interface jvm native

1
推荐指数
1
解决办法
888
查看次数