小编Jac*_*ack的帖子

何时废弃hashmap内容以避免性能下降?

我正在使用大型(数百万)hashmap实现Java,实际上构建的容量为10.000.000,加载因子为.75,它用于缓存一些值

因为缓存的值随着时间的推移变得无用(不再被访问)但是我无法删除无用的值,而我想在它的性能开始降低时完全清空缓存.我该怎么决定什么时候做好呢?

例如,当它达到750万个元素时,我应该清空它的1000万容量和.75 因为我尝试了各种阈值,但我希望有一个分析值.

我已经测试了这样一个事实:当它非常饱满时将它移除是对性能的提升(擦除之后的前2-3次算法迭代只是填充它,然后它开始比擦除之前更快地运行)

编辑:附加信息

hashmap长按键并浮动为值.它包含内容的缓存关联,因为它是我想缓存它们的标记向量的点积(以提高性能).

所以基本上我所做的是long使用2个内容的哈希码计算密钥:

static private long computeKey(Object o1, Object o2)
{
    int h1 = o1.hashCode();
    int h2 = o2.hashCode();

    if (h1 < h2)
    {
        int swap = h1;
        h1 = h2;
        h2 = swap;
    }

    return ((long)h1) << 32 | h2;
}
Run Code Online (Sandbox Code Playgroud)

并使用它来检索存储的值.会发生的是,因为它是一个层次化的聚类内容被合并,并且不再需要它们与其他内容的相关值..这就是为什么我想不时擦除哈希映射,以避免由于其中无用的值而导致的降级.

WeakHashMap当仍然需要时,使用遗嘱会无法预测地删除数据.我无法控制它.

谢谢

java performance hashmap load-factor

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

匹配元组

根据我的理解,我可以在match ... with带有元组值的表达式中使用模式匹配,所以类似于

match b with
  ("<", val) -> if v < val then true else false
  | ("<=", val) -> if v <= val then true else false
Run Code Online (Sandbox Code Playgroud)

应该是正确的,但它给我一个语法错误,就好像无法使用括号:

文件"ocaml.ml",第41行,字符14-17:错误:语法错误:')'预期

文件"ocaml.ml",第41行,字符8-9:错误:这个'('可能是不匹配的

参考第一场比赛条款..

除此之外,我可以避免匹配字符串并使用字符串的eval来应用比较吗?或者直接使用比较运算符作为元组的第一个元素?

ocaml tuples pattern-matching

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

与OCaml中的功能匹配?

是否可以直接在指定函数上使用模式匹配,或者使用一些不需要为我需要的每个函数指定类型的漏洞利用?

只是为了解释一些事情,假设我有类似的类型

type BBoolOp = (bool->bool->bool)*term*term
Run Code Online (Sandbox Code Playgroud)

并假设这些bool->bool->bool函数非常简单,就像(&&) (||)..

是否可以根据指定的功能执行不同的操作,如:

match bop with
  (||) -> do something
  | (&&) -> do something else
Run Code Online (Sandbox Code Playgroud)

这不应该是可能的,因为无法比较函数,但可能存在一个漏洞来做我正在尝试做的事情:)

提前致谢

ocaml function pattern-matching

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

在SVN提交期间运行作业

这是在特定存储库收到提交时集成应在svn服务器上完成的任务的最佳方法吗?

简要说明:我想从一个实际在个人SVN服务器上维护的java项目构建一个JAR应用程序,我想以全自动方式完成.

目前我没有使用任何建筑工具(例如ANT),因此首选简单但功能性的解决方案.

提前致谢!

java svn task

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

C/C++ 结构中的字段顺序

我有类似的情况

struct Child
{
  u16 x, y;
  // other fields
};

struct Father
{
  struct Child child1;
  struct Child child2;
  // other fields
};

Father tilemap[WIDTH][HEIGHT];
Run Code Online (Sandbox Code Playgroud)

现在我才意识到我想为 x,y 保存四个字节,对于同一个父亲的两个孩子,这些字节总是设置为相同的值。

在我的代码周围Father*,我传递了很多很多,Child*同时分别使用father->child1->x或恢复坐标child1->x。我想安全地在Father水平上移动坐标,但我不确定一些事实。

与 gcc/g++ 的任何优化或可能实现相比,是否会遵守声明字段的顺序?我能有信心&father == &father.child1吗?

这里真正的问题是我在Child*不知道它是 child1 还是 child2 字段的情况下通过,所以我不能直接知道偏移量来恢复父亲的地址(以及坐标)。我想在Child级别上使用一点来区分它们,但会那么我可以轻松地恢复父亲的地址吗?

任何建议将不胜感激,谢谢

编辑:作为进一步的信息,我使用 C++ 作为我的主要语言,但这些结构不包含任何奇怪的方法,只有字段和空的构造函数。

c c++ struct pointers

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

FileOutputStream中的新行

下一行的Ascii值是10.所以我尝试了这个......

 FileOutputStream os = new  FileOutputStream(f, true);
    os.write(10);  // this should get me to next line ?
    os.write(b);   // b is a byte array...
Run Code Online (Sandbox Code Playgroud)

java outputstream fileoutputstream

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

Java解析UTF8

我有一个UTF8文件的以下问题,结构如下:

FIELD1§FIELD2§FIELD3§FIELD4

查看它用于A7编码的文件的十六进制值§.所以根据这个编码它应该是UTF8,但它很奇怪,因为A7> 7F所以1个字节不足以编纂§.

所以我尝试直接BufferedReader使用指定的字符集:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(input), utf8))
Run Code Online (Sandbox Code Playgroud)

但是当我尝试用字符串标记字符串时

SmartTokenizer st = new SmartTokenizer(toTokenize, "§")
Run Code Online (Sandbox Code Playgroud)

(这SmartTokenizerStringTokenizer保留空标记的修改版本)

不会发生分裂,如果我尝试打印我获得的字符串

FIELD1?FIELD2?FIELD3?...

因此§在文件中使用的不同于指定为分隔符的文件,并且它也无法打印出来.

那么这里的问题是什么?也许原始文件应该使用2个字节来存储§

java utf-8 character-encoding

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

帮助理解多维数组

我一直在谷歌搜索以获得教程来理解三维数组,但似乎所有的教程都是二维数组.所以我需要一些解释来理解三维阵列的运行情况.

我非常了解二维数组,但我发现很难理解3和4等维数组.我知道2-D数组代表行和列但是这个3-D数组呢:

我对下面代码的理解是应该有3行和4列,但是最后一个位置的5使它看起来不同.我需要帮助来理解为什么有12行和5列.如果你能帮助我理解4或5-D阵列

谢谢.

 class ThreeDMatrix

{

public static void main(String[] args) 

{

int threeD[][][] = new int[3][4][5];

int i,j,k;

for (i=0; i<3; i++)

for(j=0; j<4; j++)

for (k=0; k<5; k++)

threeD[i][j][k]= i*j*k;


{

for(i=0; i<3; i++)

for(j=0; j<4; j++){

for (k=0; k<5; k++ )

{

System.out.print("-" + threeD[i][j][k]); 

}

System.out.println();

}

System.out.println();

}

}
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

-0-0-0-0-0

-0-0-0-0-0

-0-0-0-0-0

-0-0-0-0-0

-0-0-0-0-0

-0-1-2-3-4

-0-2-4-6-8

-0-3-6-9-12

-0-0-0-0-0

-0-2-4-6-8

-0-4-8-12-16

-0-6-12-18-24
Run Code Online (Sandbox Code Playgroud)

抱歉代码的渲染效果不佳.我真的不知道如何正确使用代码标签.如果有人会告诉我,那么我将重新发布.谢谢

java

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

C sizeof char指针

为什么这个char变量的大小等于1?

int main(){

char s1[] = "hello";

fprintf(stderr, "(*s1) : %i\n", sizeof(*s1) )    // prints out 1

}
Run Code Online (Sandbox Code Playgroud)

c pointers sizeof char

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

如何遍历作为指针传递的向量

我的问题是在下面的代码注释中。

void printVec(std::vector<int> *myVec) {

 // How to do such looping not to dereference pointer
 for (int i = 0; i < myVec->size(); i++) {
   std::cout << myVec->[i] << " ";
 }
}
Run Code Online (Sandbox Code Playgroud)

c++ pointers

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