这可能属于"不太可行"或"不值得付出努力"的范畴,但这里也是如此.
我正在尝试随机访问存储在多部分gzip文件中的记录.具体来说,我感兴趣的文件是压缩的Heretrix Arc文件.(如果您不熟悉多部分gzip文件,gzip规范允许在单个gzip文件中连接多个gzip流.它们不共享任何字典信息,它是简单的二进制附加.)
我认为应该可以通过寻找文件中的某个偏移来执行此操作,然后扫描gzip魔术头字节(即根据RFC的 0x1f8b ),并尝试从以下字节读取gzip流.这种方法的问题在于,那些相同的字节也可能出现在实际数据中,因此寻找这些字节会导致无效的位置开始从中读取gzip流.有没有更好的方法来处理随机访问,因为记录偏移不是先验已知的?
我有一个对象数组(比如图像),它太大而无法放入内存(例如40GB).但是我的代码需要能够在运行时随机访问这些对象.
做这个的最好方式是什么?
从我的代码的角度来看,当然,如果某些数据存在于磁盘上或临时存储在内存中,则无关紧要; 它应该具有透明访问权限:
container.getObject(1242)->process();
container.getObject(479431)->process();
Run Code Online (Sandbox Code Playgroud)
但是我应该如何实现这个容器呢?它应该只是将请求发送到数据库吗?如果是这样,哪一个是最佳选择?(如果是数据库,那么它应该是免费的而不是太多的管理麻烦,也许Berkeley DB或sqlite?)
我是否应该自己实现它,在访问沙子时,在内存充满时将内存记忆清除?或者那里有好的库(C++)吗?
对容器的要求是它最小化磁盘访问(我的代码可能更频繁地访问某些元素,因此它们应该保存在内存中)并允许快速访问.
更新:我发现STXXL不能解决我的问题,因为我存储在容器中的对象具有动态大小,即我的代码可以在运行时更新它们(增加或减少某些对象的大小).但STXXL无法处理:
STXXL容器假定它们存储的数据类型是普通旧数据类型(POD). http://algo2.iti.kit.edu/dementiev/stxxl/report/node8.html
你能否评论其他解决方案?那么使用数据库呢?哪一个?
当我尝试使用RandomAccessFile创建文件时遇到FileNotFoundException:
RandomAccessFile file = new RandomAccessFile("/test.jpg", "rw");
Run Code Online (Sandbox Code Playgroud)
我现在不知道怎么解决这个问题.这让我疯了.
谢谢
我正在运行一个需要随机访问一个非常大的文件(大约151千兆字节)的程序.我发现无论何时它在Orchard实验室的某台MacPro机器上运行(详情请访问http://inst.eecs.berkeley.edu/cgi-bin/clients.cgi?choice=6a&string=),程序会尝试读取文件的特定部分并因文件系统中的错误而崩溃:
java.io.IOException: Invalid argument
at java.io.RandomAccessFile.readBytes(Native Method)
at java.io.RandomAccessFile.read(RandomAccessFile.java:322)
Run Code Online (Sandbox Code Playgroud)
我只是使用RandomAccessFile类.
RandomAccessFile fd;
//...Initialized and already used fd with
//no problems for larger locations as well
//location == 155587178230
//numBytes == 15492560
//off == 0
//arr.length == 15492560
fd.seek(location);
fd.read(arr, off, numBytes);
Run Code Online (Sandbox Code Playgroud)
无论我使用哪种Orchard实验室计算机,每次都在相同的确切字节范围内发生它.
我在运行Debian Linux的DELL计算机上测试了这段代码而没有遇到这个问题.
我有一个10GB的CSV文件,它本质上是一个巨大的方阵.我正在尝试编写一个能够尽可能有效地访问矩阵的单个单元格的函数,即矩阵[12345,20000].
鉴于它的大小,显然不可能将整个矩阵加载到2D数组中,我需要以某种方式直接从文件中读取值.
我用谷歌搜索文件随机访问使用FileStream.Seek,但不幸的是由于变量舍入每个单元格不是固定的宽度.我不可能寻找一个特定的字节,并通过某种算术知道我正在看什么单元格.
我考虑扫描文件并为每行的第一个字节的索引创建一个查找表.这样,如果我想访问矩阵[12345,20000],我会寻找行12345的开头,然后扫描整行,计算逗号直到我到达正确的单元格.
我即将尝试这个,但还有其他人有更好的想法吗?我敢肯定,我不会是第一个尝试处理这样一个文件的人.
干杯
编辑:我应该注意该文件包含一个非常稀疏的矩阵.如果解析CSV文件的速度太慢,我会考虑将文件转换为更合适,更容易处理的文件格式.存储稀疏矩阵的最佳方法是什么?
什么是让GPU有效地计算"反功能"例程的最佳模式,这通常取决于定位的内存写入而不是读取?例如.比如计算直方图,排序,按百分比划分数字,将不同大小的数据合并到列表等中.
让我们举个例子来简化它.我构建了一个构造函数采用的列表integer和a List<Integer>.我的列表将包含给定列表的所有元素乘以integer.我的列表不存储新元素,而是动态计算它们:
class MyList extends AbstractList<Integer> implements RandomAccess {
private final int multiplier;
private final List<Integer> list;
public MyList(int multiplier, List<Integer> list) {
this.multiplier = multiplier;
this.list = list;
}
@Override
public Integer get(int index) {
return list.get(index) * multiplier;
}
@Override
public int size() {
return list.size();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我们可以调用new MyList(3, list)与list = [0, 1, 2, 3]获得[0, 3, 6, 9].
我想限制开发人员给MyList构造函数一个列表,这也是RandomAccess为了确保他不会破坏性能.
我尝试用以下方法更改构造函数:
public <E …Run Code Online (Sandbox Code Playgroud) 在RandomAccess的java doc中,类编写了"List实现使用的Marker接口,表明它们支持快速(通常是恒定时间)随机访问.此接口的主要目的是允许通用算法改变它们的行为以提供良好的性能.适用于随机或顺序访问列表."
但我发现了一些奇怪的事情
这是java.util包中AbstractList.java中的subList方法
public List<E> subList(int fromIndex, int toIndex) {
return (this instanceof RandomAccess ?
new RandomAccessSubList<>(this, fromIndex, toIndex) :
new SubList<>(this, fromIndex, toIndex));
}
Run Code Online (Sandbox Code Playgroud)
RandomAccessSubList类的实现:
class RandomAccessSubList<E> extends SubList<E> implements RandomAccess {
RandomAccessSubList(AbstractList<E> list, int fromIndex, int toIndex) {
super(list, fromIndex, toIndex);
}
public List<E> subList(int fromIndex, int toIndex) {
return new RandomAccessSubList<>(this, fromIndex, toIndex);
}
}
Run Code Online (Sandbox Code Playgroud)
SubList类实现:
SubList(AbstractList<E> list, int fromIndex, int toIndex) {
if (fromIndex < 0)
throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
if (toIndex …Run Code Online (Sandbox Code Playgroud)