Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby/python中的低级文件处理_Python_R_Dataset_Fortran_Data Processing - Fatal编程技术网

ruby/python中的低级文件处理

ruby/python中的低级文件处理,python,r,dataset,fortran,data-processing,Python,R,Dataset,Fortran,Data Processing,所以我希望这个问题还没有得到回答,但我似乎无法找到正确的搜索词 首先是一些背景: 我有表格格式的文本数据文件,可以轻松地爬升到10 GBs。在进行设备处理和控制时,处理这些数据的计算机已经从长达数小时的数据采集(高达30-50MB/s)中承受了沉重的负载。因此,磁盘空间和访问量非常昂贵。由于空间限制,我们还没有从旋转磁盘转移到SSD 然而,我们希望用刚刚收集的数据做一些事情,而不需要每个数据点。我们希望大量收集数据,每1000个点收集一次。然而,加载这些文件(每个都是千兆字节)会给磁盘带来巨大的

所以我希望这个问题还没有得到回答,但我似乎无法找到正确的搜索词

首先是一些背景: 我有表格格式的文本数据文件,可以轻松地爬升到10 GBs。在进行设备处理和控制时,处理这些数据的计算机已经从长达数小时的数据采集(高达30-50MB/s)中承受了沉重的负载。因此,磁盘空间和访问量非常昂贵。由于空间限制,我们还没有从旋转磁盘转移到SSD

然而,我们希望用刚刚收集的数据做一些事情,而不需要每个数据点。我们希望大量收集数据,每1000个点收集一次。然而,加载这些文件(每个都是千兆字节)会给磁盘带来巨大的负载,这是不可接受的,因为这可能会中断实时采集系统

我想知道是否可以使用低级方法访问文件中的每个第n个字节(或其他方法)(就像数据库一样),因为文件定义得非常好(每行两个64位双精度)。我知道太低级别的访问可能不起作用,因为硬盘可能是碎片化的,但最好的方法是什么?我更喜欢python或ruby的解决方案,因为这是处理的基础,但从理论上讲,R、C或Fortran也可以工作

最后,升级计算机或硬件不是一个选项,设置系统需要数百个工时,因此只能执行软件更改。然而,这将是一个长期的项目,但如果文本文件不是处理这些文件的最佳方式,我也愿意接受其他解决方案


编辑:我们生成(取决于使用情况)从50000行/秒到500万行/秒的数据库,无论以何种速度都是不可行的

在文件对象上使用seek和read方法应该可以做到这一点。这样做将防止将整个文件加载到内存中,因为您将只处理文件流

此外,由于文件定义良好且可预测,因此在查找文件中下一条记录的前N个字节时不会遇到任何问题

下面是一个例子。在

with open("pretend_im_large.bin", "rb") as f:
    start_pos = 0
    read_bytes = []

    # seek to the end of the file
    f.seek(0,2)
    file_size = f.tell()

    # seek back to the beginning of the stream
    f.seek(0,0)

    while f.tell() < file_size:
        read_bytes.append(f.read(1))
        f.seek(9,1)


print read_bytes
上述代码的输出为:

['A', 'B', 'C', 'D', 'E', 'F']

我不认为Python会给您一个强有力的保证,即当您使用
f.seek
时,它实际上不会读取整个文件。我认为这是太平台和实现特定于Python的。您应该使用特定于Windows的工具来保证随机访问,而不是顺序访问

您可以修改以满足您的需要。您可以定义两个64位整数长的记录类型。或者,您可以使用a并使用其
seek
方法来获取所需内容


如果这是一款性能关键型软件,我认为您需要确保能够访问能够满足您需求的操作系统原语。我找不到任何引用表明Python的
seek
将实现您想要的功能。如果你走这条路,你需要测试它,以确保它做它似乎应该做的

文件是人类可读的文本还是计算机的本机格式(有时称为二进制)?如果文件是文本,则可以通过切换到本机格式来减少处理负载和文件大小。从浮点数的内部表示转换为人工读取的数字是CPU密集型的


如果文件是本机格式,那么应该很容易在文件中跳过,因为每个记录将是16字节。在Fortran中,使用open语句打开文件,该语句包括
form=“unformated”、access=“direct”、recl=16
。然后,您可以通过read语句中的
rec=X
读取任意记录X,而无需读取中间记录。如果文件是文本,也可以使用直接IO读取,但可能不是每两个数字总是使用相同数量的字符(字节)。你可以检查你的文件并回答这个问题。如果记录的长度始终相同,则可以使用相同的技术,只需使用
form=“formatted”
。如果记录长度不同,则您可以读取一个大数据块并在该数据块中找到您的数字。

为什么不直接将数据收集到数据库中?不幸的是,仪器控制和采集软件的数据库界面非常糟糕,速度非常慢,尝试创建一个记录需要50毫秒,我们每秒生成500万条记录。我们可以在完成大数据文件后将其放在一个blob中,但这并不能解决我们的问题,因为数据要实时收集好几个小时。您使用的是什么操作系统?这是一个非常有趣的问题。再一次,收集软件的另一个不幸问题。它只为Windows编写。我也忘了提到。数据速率比我最初指定的要快得多,有时传输速率低至800 KB/s,约为50000行/秒(50 KHz采样)。是否保证不读取任何中间字节?我想这是一个非常依赖平台的事情。如果
f.seek()
知道如何在不实际读取9字节的情况下前进9字节,我会有点惊讶。我想不出有哪个平台不支持这里使用的文件查找。如果你找到了,告诉我好吗?不管它在幕后是如何实现的,关键是整个文件不会同时读入内存(整行也不会)。仅供参考:linux()中的
lseek
方法,window()中的
SetFilePointer
方法,以及mac()上的
lseek
方法,仅仅因为底层操作系统支持它,并不意味着
f.seek
的实现方式利用了它。我认为Python不能保证它会利用这些操作系统特性,所以我会犹豫是否依赖它(如果没有这两个特性的话)
['A', 'B', 'C', 'D', 'E', 'F']