标签: random-access

多部分gzip文件随机访问(Java)

这可能属于"不太可行"或"不值得付出努力"的范畴,但这里也是如此.

我正在尝试随机访问存储在多部分gzip文件中的记录.具体来说,我感兴趣的文件是压缩的Heretrix Arc文件.(如果您不熟悉多部分gzip文件,gzip规范允许在单个gzip文件中连接多个gzip流.它们不共享任何字典信息,它是简单的二进制附加.)

我认为应该可以通过寻找文件中的某个偏移来执行此操作,然后扫描gzip魔术头字节(即根据RFC的 0x1f8b ),并尝试从以下字节读取gzip流.这种方法的问题在于,那些相同的字节也可能出现在实际数据中,因此寻找这些字节会导致无效的位置开始从中读取gzip流.有没有更好的方法来处理随机访问,因为记录偏移不是先验已知的?

compression gzip multipart random-access

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

随机访问容器不适合内存?

我有一个对象数组(比如图像),它太大而无法放入内存(例如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

你能否评论其他解决方案?那么使用数据库呢?哪一个?

c++ database memory random-access data-structures

6
推荐指数
2
解决办法
693
查看次数

使用RandomAccessFile创建文件时的java.io.FileNotFoundException

当我尝试使用RandomAccessFile创建文件时遇到FileNotFoundException:

RandomAccessFile file = new RandomAccessFile("/test.jpg", "rw");
Run Code Online (Sandbox Code Playgroud)

我现在不知道怎么解决这个问题.这让我疯了.

谢谢

java android filenotfoundexception random-access

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

java.io.RandomAccessFile mac上的大文件的无效参数

我正在运行一个需要随机访问一个非常大的文件(大约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计算机上测试了这段代码而没有遇到这个问题.

java macos file-io random-access large-files

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

CSV随机访问; C#

我有一个10GB的CSV文件,它本质上是一个巨大的方阵.我正在尝试编写一个能够尽可能有效地访问矩阵的单个单元格的函数,即矩阵[12345,20000].

鉴于它的大小,显然不可能将整个矩阵加载到2D数组中,我需要以某种方式直接从文件中读取值.

我用谷歌搜索文件随机访问使用FileStream.Seek,但不幸的是由于变量舍入每个单元格不是固定的宽度.我不可能寻找一个特定的字节,并通过某种算术知道我正在看什么单元格.

我考虑扫描文件并为每行的第一个字节的索引创建一个查找表.这样,如果我想访问矩阵[12345,20000],我会寻找行12345的开头,然后扫描整行,计算逗号直到我到达正确的单元格.

我即将尝试这个,但还有其他人有更好的想法吗?我敢肯定,我不会是第一个尝试处理这样一个文件的人.

干杯

编辑:我应该注意该文件包含一个非常稀疏的矩阵.如果解析CSV文件的速度太慢,我会考虑将文件转换为更合适,更容易处理的文件格式.存储稀疏矩阵的最佳方法是什么?

c# csv file random-access

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

使用OpenGL进行高效的GPU随机存储器访问

什么是让GPU有效地计算"反功能"例程的最佳模式,这通常取决于定位的内存写入而不是读取?例如.比如计算直方图,排序,按百分比划分数字,将不同大小的数据合并到列表等中.

opengl gpu gpgpu glsl random-access

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

减去并比较随机访问迭代器:为什么以及在哪里?

我正在为我的工作开发一个小型库,我从标准的随机访问迭代器类中派生了一些类.这允许我使用像迭代器特征这样的东西,并且当我使用标准库时不要太担心algorithm.当然我知道我不必,而且我可以选择双向类别,甚至可以实现我自己的类别.但这不是重点.

IMO,"差距"时,双向和随机存取类别之间是太大了,我不明白的减法和比较操作的必要性迭代器之间的 -那就是:a-b,a<b并且a>b(和宽松的变体).

为什么标准强制执行这些运算符,有人可以给我一个例子,其中(in)相等性测试,混合迭代器 - 标量算术(复合或非复合)运算符和偏移解引用运算符是不够的?

c++ iterator random-access

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

如何返回多个类型的对象

让我们举个例子来简化它.我构建了一个构造函数采用的列表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)

java collections list random-access

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

使用指针作为容器迭代器违反标准

Angew评论vector使用原始指针作为迭代器类型很好.那种情绪让我陷入了困境.

我开始研究它,发现对vector迭代器的要求只是它们是"随机访问迭代器",它明确指出指针符合条件:

指向数组元素的指针满足所有要求

是编译器甚至vector为调试目的提供迭代器的唯一原因,还是实际上我错过了一个要求vector

c++ pointers iterator vector random-access

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

AbstractList.java中RandomAccess的操作

在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)

java collections random-access

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