小编Tho*_*ler的帖子

如何在文本中间的<p> </ p>中使用<h2>标记</ h2>?

我想做这样的事情:

<p>This is a <h2>text</h2> paragraph.</p>
Run Code Online (Sandbox Code Playgroud)

我为h2禁用了边距和填充,但它仍然在h2标记之前和之后打破了这一行.如何在文本中间使用h2标签,使其看起来像是正常的单词,就像<b>一样?

我的html文档的doctype是"XHTML 1.0 Transitional"

html css xhtml text

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

关闭RandomAccessFile有时需要45秒

在我的程序中,关闭java.util.RandomAccessFile有时需要45秒(好吧,几乎完全是:在44.998和45.003秒之间).该程序创建和关闭许多小文件.通常关闭文件非常快(在0到0.1秒之间).如果我调试程序,它将停留在本机方法RandomAccessFile.close0中.

使用FileOutputStream而不是RandomAccessFile时也会出现同样的问题(在这种情况下,程序在本机方法FileOutputStream.close0中被阻止).

有人知道那会是什么吗?你能在你的系统上重现这个问题(我只能在Mac上重现它,而不能在Windows XP上重现;我还没有在Linux上测试过)?


更新2:

这似乎只发生在Mac OS X上.我使用的是JDK 1.6.0_22-b04.它发生在32位和64位上.在Windows XP上似乎没有发生.

我的测试用例是:

import java.io.File;
import java.io.RandomAccessFile;
public class TestFileClose {
    public static void main(String... args) throws Exception {
        for (int i = 0; i < 100000; i++) {
            String name = "test" + i;
            RandomAccessFile r = new RandomAccessFile(name, "rw");
            r.write(0);
            long t = System.currentTimeMillis();
            r.close();
            long close = System.currentTimeMillis() - t;
            if (close > 200) {
                System.out.println("closing " + name +
                        " took " + close + " ms!");
            } …
Run Code Online (Sandbox Code Playgroud)

java jdk1.6 random-access osx-snow-leopard

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

如何检测String.substring是否复制字符数据

我知道对于Oracle Java 1.7更新6及更高版本,在使用时String.substring,会复制String的内部字符数组,对于旧版本,它将被共享.但我发现没有官方API可以告诉我当前的行为.

用例

我的用例是:在解析器中,我喜欢检测是String.substring复制还是共享底层字符数组.问题是,如果字符数组是共享的,那么我的解析器需要明确地"取消共享" new String(s)以避免内存问题.但是,如果String.substring无论如何都要复制数据,那么这不是必需的,并且可以避免在解析器中显式复制数据.使用案例:

// possibly the query is very very large
String query = "select * from test ...";
// the identifier is used outside of the parser
String identifier = query.substring(14, 18);

// avoid if possible for speed,
// but needed if identifier internally 
// references the large query char array
identifier = new String(identifier);
Run Code Online (Sandbox Code Playgroud)

我需要的

基本上,我想有一个静态方法boolean isSubstringCopyingForSure(),可以检测是否new String(..)不需要.如果检测不起作用,我没关系SecurityManager.基本上,检测应该是保守的(为了避免内存问题,我宁愿使用,new String(..)即使没有必要). …

java string jvm ibm-jvm

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

是否可以为最小(&lt;64)个键集创建单独的最小哈希函数而无需单独的查找表?

最近,我读了这篇文章扔掉密钥:简单,最小的完美散列有关为一组已知的密钥生成最小的完美散列表。

本文似乎假设您需要一个中间表。如果我们假设键的集合很小(即<64),是否还有其他更简单的方法来生成这样的函数。

就我而言,我想将一组线程ID:s映射到数组中的唯一数据块。线程在生成哈希函数之前启动,并在程序运行期间保持不变。确切的线程数有所不同,但在程序运行时保持不变:

unsigned int thread_ids*;
unsigned int thread_count;
struct {
    /* Some thread specific data */
}* ThreadData;

int start_threads () {
    /* Code which starts the threads and allocates the threaddata. */
}

int f(thread_id) {
    /* return unique index into threadData */
}

int main() {
    thread_count = 64; /* This number will be small, e.g. < 64 */
    start_threads();
    ThreadData[f(thread_ids[0])]
}
Run Code Online (Sandbox Code Playgroud)

c algorithm hash perfect-hash

9
推荐指数
2
解决办法
344
查看次数

高效查找标记的引用记录

我有

  • 数据库中有几百万条记录
  • 互相引用(有向无环图)。有直接引用(A -> B)和间接引用(如果 A -> B 且 B -> C,则 A -> C)。间接引用可以有任意递归深度,但实际上深度最多为 100。这与面向对象语言中的对象可以递归引用其他对象非常相似,只是不允许循环。
  • 一条记录可以有 0 到 100 个直接引用。
  • 每条记录可以标记也可以不标记(大多数记录没有标记)。

问题

我正在寻找一种有效的数据结构和算法来找到所有给定一组记录(通常只有一个,或最多 100 个)的所有标记引用(直接或间接引用)记录。存在直接标记的记录(如果标记了直接引用的记录)或间接标记的记录(如果标记了间接引用的记录)。

读取记录相对较慢,假设每条记录 2 毫秒。

我是不想在这里使用更快的存储或类似的存储。我知道这是可能的,但保持同步非常困难。我正在尝试添加仅包含相关数据的辅助数据结构。这将大大加快速度(可能是 10 倍甚至 100 倍),但会带来恒定因子的改进。我仍然有兴趣了解如果数据量增加,是否可以改进算法。

想法

我考虑过以下选项:

  • 蛮力:一种算法是搜索所有(直接或间接引用的)条目,并过滤标记的条目。但这显然很慢,因为我必须处理所有(直接或间接)引用的条目。也许没有被标记,但有 20,000 个被引用。

  • 影子标记:另一种算法是有一个反向索引(哪些条目引用哪些其他条目),然后每次标记一个条目时,也递归地“影子标记”引用该条目的所有条目。这样,当搜索标记条目时,我们可以过滤那些设置了“shadow-mark”的条目。缺点是如果标记了条目,则需要进行多次更新。一个相关的选项是使用布隆过滤器进行阴影标记。但这只会减少内存使用量。

  • 假设我们维护一个“最大深度”,它是树的最大深度(任何记录的最大跳数)。然后我们使用上面的阴影标记算法,但只是部分使用:仅达到最大深度/2个递归级别。所以我们限制阴影标记的传播。然后,对于一个查询,我们还将递归深度限制为最大深度/2。这样,在最坏的情况下我们将“在中间相遇”。(我可能应该画一张图。)一个子问题是如何有效地维持这个最大深度。

我想知道,是否有类似这种方法的东西?在标记条目时不需要太多更新,并且在查询时不需要太多读取的东西?或者也许是一个允许逐步更新条目(如果条目被标记)的解决方案?

例子

在这个例子中(蓝色是“标记”),例如,如果我搜索(间接)引用标记记录 5,我想快速找到 1 和 3。

几个节点互相指向的图

algorithm graph-theory graph data-structures

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

番石榴布隆过滤器不支持大插入?

我在guava v.11.0.1中使用BloomFilter,当插入很大时,我似乎得到了一个异常.我用0.001 fpp尝试了1000万,但失败了.

java.lang.IllegalArgumentException: Number of bits must be positive
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:88)
    at com.google.common.hash.BloomFilterStrategies.checkPositiveAndMakeMultipleOf64(BloomFilterStrategies.java:72)
    at com.google.common.hash.BloomFilterStrategies.access$000(BloomFilterStrategies.java:18)
    at com.google.common.hash.BloomFilterStrategies$From128ToN.withBits(BloomFilterStrategies.java:37)
    at com.google.common.hash.BloomFilter.create(BloomFilter.java:192)
    at com.ipg.collection.BloomFilterWritable.impl(BloomFilterWritable.java:43)
    at com.ipg.collection.BloomFilterWritable.put(BloomFilterWritable.java:62)
    at com.ipg.prophet.twitter.twitflow.archive.UnzipTweetsProcessAndUpload$ProcessorConsumer.process(UnzipTweetsProcessAndUpload.java:107)
    at com.ipg.prophet.twitter.twitflow.archive.UnzipTweetsProcessAndUpload$ProcessorConsumer.run(UnzipTweetsProcessAndUpload.java:84)
    at java.lang.Thread.run(Thread.java:662)
Run Code Online (Sandbox Code Playgroud)

我认为至少应该支持那么多具有如此高fpp的插入,不应该吗?

bloom-filter guava

8
推荐指数
2
解决办法
1572
查看次数

在H2中的重复键更新功能

我使用H2(嵌入式)开发了java桌面应用程序.我只是掌握了有关数据库的基本知识,所以我只需安装H2并创建模式名称RecordAutomation,然后将表添加到该模式.现在我正在尝试使用ON DUPLICATE KEY UPDATE功能来处理特定的表,这个表没有给出sql语法错误,我检查我的查询我发现它是正确的,如下所示

INSERT INTO RECORDAUTOMATION.MREPORT 
(PRODUCTID ,DESCRIPTION ,QUANTITY ,SUBTOTAL ,PROFIT ) 
VALUES (22,olper,5,100,260) 
ON DUPLICATE KEY UPDATE SET QUANTITY = QUANTITY+5;
Run Code Online (Sandbox Code Playgroud)

我搜索并尝试解决这个问题,因为这个功能对非默认表不起作用.我不知道默认和非默认.请帮帮我

sql h2

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

Liquibase放弃约束而不知道它的名字

我们使用liquibase来跟踪我们的数据库更改.首先,changeSet包含以下行:

<column name="SHORT_ID" type="INTEGER">
   <constraints unique="true" />
</column>
Run Code Online (Sandbox Code Playgroud)

基本上它意味着SHORT_ID列具有唯一约束,但此约束的名称可以是任何内容,并且通常每次都不同(我们对H2数据库运行一些集成测试,每次运行测试时都会生成新的基础)

所以..问题是:我无法改变这第一个changeSet但现在我们必须摆脱这个独特的约束.有任何想法如何通过使用liquibase实现这一目标?

java sql constraints h2 liquibase

7
推荐指数
2
解决办法
5781
查看次数

H2数据库默认值为TIMESTAMP列

我正在用H2数据库编写集成测试.我的数据库(生成)初始化包含此脚本(因为生成的连接表没有此列):

ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT NOW();
Run Code Online (Sandbox Code Playgroud)

这是我创建记录的方式:

Integration integrationOne = createIntegration(firstId, "FIRST");
Integration integrationTwo = createIntegration(secondId, "SECOND");
flushAndClear();
userService.logRecentIntegration(integrationOne.getId(), user.getId());
flushAndClear();
userService.logRecentIntegration(integrationTwo.getId(), user.getId()); //1
Run Code Online (Sandbox Code Playgroud)

方法logRecentIntegrations(..,..)只调用DAO,dao执行此操作:

Query query = entityManager.createNativeQuery(
    "INSERT INTO INT_USR (USR_ID, INT_ID) VALUES (?, ?)");
query.setParameter(1, userId)
    .setParameter(2, integrationId);
query.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

后来在我的测试中:

Query query = entityManager.createNativeQuery(
    "SELECT * FROM INT_USR ORDER BY IU_INSDTTM");
List resultList = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

当我在resultList中调试此测试时,有两个记录(正确)但它们具有相同的时间戳.即使我在标记为// 1的行上插入断点并等待一段时间 - 因此插入之间的时间间隔也很重要.(Thread.sleep - 相同的结果)

我试图将SQL脚本修改为

ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)

但结果相同.为什么两个结果都有相同的时间戳?

java jpa h2

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

非常慢的Java完整GC挂钟

有时,在测试机器(Windows)上,Java full GC需要20秒以上.GC日志显示real时间非常高,user也很高,但不是很高(大约3秒).在一个案例中,它是:

21.2209796 secs [Times: user=3.76 sys=0.45, real=21.22 secs]
Run Code Online (Sandbox Code Playgroud)

可能是什么原因?我怀疑但现在不想说.

找出根本原因的最简单方法是什么?如果您不了解Windows但知道Linux,那也是一个选项:测试可以在Linux上重新运行.

该过程开始如下:

"%JAVA_HOME%\bin\java.exe" -verbose:gc -XX:+PrintGCDetails 
    -XX:+PrintGCDateStamps -Xloggc:publish.gc.log 
    -XX:PermSize=256m -XX:MaxPermSize=1024m -Xms1024m 
    -Xmx3072m -XX:NewSize=352m -XX:MaxNewSize=352m 
    -XX:SurvivorRatio=6 
Run Code Online (Sandbox Code Playgroud)

我不知道为什么NewSize,XX:MaxNewSize并且SurvivorRatio被使用.MaxPermSize是必需的,因为它是一个OSGi环境.完整的线程转储不会显示任何特殊内容.

完整的GC的完整日志是(抱歉,长):

2014-05-06T21:38:18.735-0700: 150.261: [Full GC [PSYoungGen: 23614K->0K(309952K)] [PSOldGen: 693188K->311405K(688128K)] 716802K->311405K(998080K) [PSPermGen: 45120K->45120K(262144K)], 1.4533481 secs] [Times: user=1.45 sys=0.01, real=1.45 secs] 
2014-05-06T21:38:58.379-0700: 189.907: [Full GC [PSYoungGen: 1664K->0K(335488K)] [PSOldGen: 668139K->283959K(688128K)] 669803K->283959K(1023616K) [PSPermGen: 46688K->46688K(262144K)], 1.3466773 secs] [Times: user=1.34 sys=0.00, real=1.35 secs] 
2014-05-06T21:39:44.082-0700: 235.613: [Full GC [PSYoungGen: …
Run Code Online (Sandbox Code Playgroud)

java garbage-collection

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