我想做这样的事情:
<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"
在我的程序中,关闭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) 我知道对于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(..)
即使没有必要). …
最近,我读了这篇文章扔掉密钥:简单,最小的完美散列有关为一组已知的密钥生成最小的完美散列表。
本文似乎假设您需要一个中间表。如果我们假设键的集合很小(即<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) 我有
问题
我正在寻找一种有效的数据结构和算法来找到所有给定一组记录(通常只有一个,或最多 100 个)的所有标记引用(直接或间接引用)记录。存在直接标记的记录(如果标记了直接引用的记录)或间接标记的记录(如果标记了间接引用的记录)。
读取记录相对较慢,假设每条记录 2 毫秒。
我是不想在这里使用更快的存储或类似的存储。我知道这是可能的,但保持同步非常困难。我正在尝试添加仅包含相关数据的辅助数据结构。这将大大加快速度(可能是 10 倍甚至 100 倍),但会带来恒定因子的改进。我仍然有兴趣了解如果数据量增加,是否可以改进算法。
想法
我考虑过以下选项:
蛮力:一种算法是搜索所有(直接或间接引用的)条目,并过滤标记的条目。但这显然很慢,因为我必须处理所有(直接或间接)引用的条目。也许没有被标记,但有 20,000 个被引用。
影子标记:另一种算法是有一个反向索引(哪些条目引用哪些其他条目),然后每次标记一个条目时,也递归地“影子标记”引用该条目的所有条目。这样,当搜索标记条目时,我们可以过滤那些设置了“shadow-mark”的条目。缺点是如果标记了条目,则需要进行多次更新。一个相关的选项是使用布隆过滤器进行阴影标记。但这只会减少内存使用量。
假设我们维护一个“最大深度”,它是树的最大深度(任何记录的最大跳数)。然后我们使用上面的阴影标记算法,但只是部分使用:仅达到最大深度/2个递归级别。所以我们限制阴影标记的传播。然后,对于一个查询,我们还将递归深度限制为最大深度/2。这样,在最坏的情况下我们将“在中间相遇”。(我可能应该画一张图。)一个子问题是如何有效地维持这个最大深度。
我想知道,是否有类似这种方法的东西?在标记条目时不需要太多更新,并且在查询时不需要太多读取的东西?或者也许是一个允许逐步更新条目(如果条目被标记)的解决方案?
例子
在这个例子中(蓝色是“标记”),例如,如果我搜索(间接)引用标记记录 5,我想快速找到 1 和 3。
我在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的插入,不应该吗?
我使用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)
我搜索并尝试解决这个问题,因为这个功能对非默认表不起作用.我不知道默认和非默认.请帮帮我
我们使用liquibase来跟踪我们的数据库更改.首先,changeSet包含以下行:
<column name="SHORT_ID" type="INTEGER">
<constraints unique="true" />
</column>
Run Code Online (Sandbox Code Playgroud)
基本上它意味着SHORT_ID列具有唯一约束,但此约束的名称可以是任何内容,并且通常每次都不同(我们对H2数据库运行一些集成测试,每次运行测试时都会生成新的基础)
所以..问题是:我无法改变这第一个changeSet但现在我们必须摆脱这个独特的约束.有任何想法如何通过使用liquibase实现这一目标?
我正在用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)
但结果相同.为什么两个结果都有相同的时间戳?
有时,在测试机器(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)