RandomAccessFile对于随机访问文件非常慢.您经常阅读有关在其上实现缓冲层的信息,但是无法在线查找代码.
所以我的问题是:你们谁知道这个类的任何开源实现共享指针或共享你自己的实现?
如果这个问题会成为关于这个问题的有用链接和代码的集合,我很确定,很多人都会共享这个问题并且SUN从来没有正确解决这个问题.
请不要引用MemoryMapping,因为文件可能比Integer.MAX_VALUE大.
我有一个带有byte []键的hashmap.我想通过TreeMap对其进行排序.
为字典顺序执行比较器的最有效方法是什么?
通常可以说:如何byte[] get(offset, length)为Java中大于2GB的内存映射文件实现一种方法.
有了上下文:
我正在尝试使用随机i/o高效读取大于2GB的文件.当然,这个想法是使用Java nio和内存映射API.
问题是内存映射限制为2GB.其中一个解决方案是映射多个2GB的页面并通过偏移量进行索引.
这里有一个类似的解决方案:
这个解决方案的问题在于它设计为在我的API应该读取时读取字节byte[](因此我的API就像这样read(offset, length)).
是否只是努力将这种终极get()变为get(offset, length)?当byte[]我在阅读两页之间时会发生什么?
我有一个Map内存存储我的对象.当我内存不足时,我想要记忆.我现在正在这样做:
void add(K key, V value) {
if (underPressure()) {
flush(innerMap);
}
innerMap.add(k, v);
}
boolean underPressure() {
Runtime rt = Runtime.getRuntime();
long maxMemory = rt.maxMemory();
long freeMemory = rt.freeMemory();
return (double) freeMemory / maxMemory < threshold;
}
Run Code Online (Sandbox Code Playgroud)
正如underPressure()每个插页所称,它有多贵?根据我的理解,因为它是一个近似值,它应该以某种方式被jvm 缓存,但是有没有人真正了解这个?
我正在尝试使用matplotlib绘制eigenbehaviors,基本上我有一个2D矩阵,并希望用与热图非常相似的东西绘制它,但是细胞是分开的并且可以识别.参见例如:
我有一个HashMap,每当我得到迭代器时,我想以不同的随机顺序迭代它们的键值对.从概念上讲,我想在调用迭代器之前"洗牌"地图(或者如果你想要,"洗牌"迭代器).
我有两种选择:
1)使用LinkedHashMap的方法并在内部保留一个条目列表,将其随地移动并在调用迭代器时返回该视图.
2)取map.entrySet(),构造一个ArrayList并在其上使用shuffle().
虽然这两种方法看起来很像我,但我期待非常大的HashMaps,所以我真的很关心细节和内部,因为我真的不能浪费内存或计算.
我有一个IO类,它使用ByteBuffer缓冲对FileChannel的访问(因此它基本上接受构造函数中的FileChannel).我想对它进行单元测试,所以如果我能得到一个支持bytearray的FileChannel以避免在测试期间创建和删除文件,那就太好了.
为了给你一个想法,如果我能得到像ByteArrayOutputStream.getChannel()这样的东西,那将是完美的.
我正在定义一个类:
class Foo<I extends Bar & Comparable<I>> {
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨I被隐藏I.我想第二次I出现在定义中是隐藏在第一个范围内,好像变量I可以分配给两种不同的类型.怎么做正确?
编辑:
这是一个内在阶级.完整的代码可以是:
class Baz<I> {
class Foo<I extends Bar & Comparable<I>> {
}
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,如果我重新提名内I到J,我不知道这I和J实际上是同一类型.
我有N个工作人员共享要计算的元素队列.在每次迭代中,每个工作程序从队列中删除一个元素,并且可以生成更多要计算的元素,这些元素将被放在同一个队列中.基本上,每个生产者也是消费者.当队列中没有元素并且所有工作者已经完成计算当前元素时,计算结束(因此不能再生成要计算的元素).我想避免调度员/协调员,所以工人应该协调.允许工人查明暂停条件是否有效的最佳模式是什么,因此代表其他人停止计算?
例如,如果所有线程都只执行此循环,那么当所有元素都被计算出来时,它将导致所有线程被永久阻塞:
while (true) {
element = queue.poll();
newElements[] = compute(element);
if (newElements.length > 0) {
queue.addAll(newElements);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一串带整数键的字典.对于我没有的密钥,我希望能够在它想要检索的密钥之前和之后检索最小和最大的密钥,但这不存在.
java中的Treemap类有两个方法正是这样做的:ceilingkey()和floorkey().
我怎么能用python做到这一点?
作为一个例子,我有一个这样的字典:
{ 1: "1", 4: "4", 6: "6" ..., 100: "100" }
Run Code Online (Sandbox Code Playgroud)
如果我要求钥匙1,我会检索"1",但如果我找钥匙3,我应该得到KeyError,因此能够得到floor(3) = 1和ceil(3) = 4.
在 numba jitted nopython 函数中,我需要用另一个数组中的值索引一个数组。两个数组都是 numpy 数组浮点数。
例如
@numba.jit("void(f8[:], f8[:], f8[:])", nopython=True)
def need_a_cast(sources, indices, destinations):
for i in range(indices.size):
destinations[i] = sources[indices[i]]
Run Code Online (Sandbox Code Playgroud)
我的代码是不同的,但让我们假设这个问题可以通过这个愚蠢的例子重现(即,我不能有 int 类型的索引)。AFAIK,我不能在 nopython jit 函数内部使用 int(indices[i]) 或 indices[i].astype("int") 。
我该怎么做呢?
MappedByteBuffer对2GIG的Java限制使得用于映射大文件变得棘手.通常推荐的方法是使用MappedByteBuffer数组并通过以下方式对其进行索引:
long PAGE_SIZE = Integer.MAX_VALUE;
MappedByteBuffer[] buffers;
private int getPage(long offset) {
return (int) (offset / PAGE_SIZE)
}
private int getIndex(long offset) {
return (int) (offset % PAGE_SIZE);
}
public byte get(long offset) {
return buffers[getPage(offset)].get(getIndex(offset));
}
Run Code Online (Sandbox Code Playgroud)
这可能适用于单个字节,但如果要处理更大且需要跨越边界的读/写(getLong()或get(byte [])),则需要重写大量代码.
问题是:对于这些场景,你最好的做法是什么,你知道任何可以在不重新发明轮子的情况下重复使用的工作解决方案/代码吗?