- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个每秒获取 250,000
样本的采样应用程序,将它们缓冲在内存中并最终附加到 提供的
。总的来说,这很棒。但是,我有一个运行并不断清空数据采集设备 (HDFStore
> Pandas DAQ
) 的线程,它需要定期运行。大约一秒的偏差往往会破坏事物。以下是观察到的时间的极端情况。 Start
表示 DAQ
读取开始,Finish
表示完成,IO
表示 HDF 写入(两者 DAQ
和 IO
发生在不同的线程中)。
Start : 2016-04-07 12:28:22.241303
IO (1) : 2016-04-07 12:28:22.241303
Finish : 2016-04-07 12:28:46.573440 (0.16 Hz, 24331.26 ms)
IO Done (1) : 2016-04-07 12:28:46.573440 (24332.39 ms)
如您所见,执行此写入需要 24 秒(典型写入约为 40 毫秒)。我正在写入的 HDD 没有负载,所以这种延迟不应该是由争用引起的(运行时它的利用率约为 7%)。我已禁用对我的 HDFStore
写入的索引。我的应用程序运行许多其他线程,所有这些线程都打印状态字符串,因此 IO 任务似乎阻塞了所有其他线程。我花了相当多的时间逐步检查代码以找出速度变慢的地方,它总是在 C 扩展提供的方法中,这导致了我的问题..
这是一个您可以运行以查看问题的示例:
import pandas as pd
import numpy as np
from timeit import default_timer as timer
import datetime
import random
import threading
import time
def write_samples(store, samples, overwrite):
frame = pd.DataFrame(samples, dtype='float64')
if not overwrite:
store.append("df", frame, format='table', index=False)
else:
store.put("df", frame, format='table', index=False)
def begin_io():
store = pd.HDFStore("D:\\slow\\test" + str(random.randint(0,100)) + ".h5", mode='w', complevel=0)
counter = 0
while True:
data = np.random.rand(50000, 1)
start_time = timer()
write_samples(store, data, counter == 0)
end_time = timer()
print("IO Done : %s (%.2f ms, %d)" % (datetime.datetime.now(), (end_time - start_time) * 1000, counter))
counter += 1
store.close()
def dummy_thread():
previous = timer()
while True:
now = timer()
print("Dummy Thread : %s (%d ms)" % (datetime.datetime.now(), (now - previous) * 1000))
previous = now
time.sleep(0.01)
if __name__ == '__main__':
threading.Thread(target=dummy_thread).start()
begin_io()
您将获得类似于以下内容的输出:
IO Done : 2016-04-08 10:51:14.100479 (3.63 ms, 470)
Dummy Thread : 2016-04-08 10:51:14.101484 (12 ms)
IO Done : 2016-04-08 10:51:14.104475 (3.01 ms, 471)
Dummy Thread : 2016-04-08 10:51:14.576640 (475 ms)
IO Done : 2016-04-08 10:51:14.576640 (472.00 ms, 472)
Dummy Thread : 2016-04-08 10:51:14.897756 (321 ms)
IO Done : 2016-04-08 10:51:14.898782 (320.79 ms, 473)
IO Done : 2016-04-08 10:51:14.901772 (3.29 ms, 474)
IO Done : 2016-04-08 10:51:14.905773 (2.84 ms, 475)
IO Done : 2016-04-08 10:51:14.908775 (2.96 ms, 476)
Dummy Thread : 2016-04-08 10:51:14.909777 (11 ms)
最佳答案
答案是否定的,这些作者没有发布 GIL。请参阅文档 here .我知道您实际上并没有尝试使用多个 线程进行写入,但这应该会提示您。当发生写入时会持有强锁,以防止多次写入。 PyTables
和 h5py
都将此作为 HDF5 标准的一部分。
可以看看SWMR ,虽然没有直接得到 pandas 的支持。 PyTables
文档 here和 here指出解决方案。这些通常涉及有一个单独的进程从队列中拉出数据并写入它。
在任何情况下,这通常都是一种更具可扩展性的模式。
关于python - C 扩展中用于 IO 有界线程的 GIL (HDF5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36488214/
只是想知道我对组/数据集名称的自由程度如何,或者是否需要使名称简短(因此可读性较差)。这适用于包含许多具有许多重复名称的组和数据集的 HDF5 文件。一些 XML API 做 string inter
简短问题 当 Pandas 在 HDFStore 上工作时(例如: .mean() 或 .apply() ),它是否将内存中的完整数据作为 DataFrame 加载,还是将记录作为 Serie 进行处
我有几个不同的相关数据框(如果需要,可以使用 id 加入它们)。但是,我并不总是同时需要它们。 由于它们非常大,将它们存储在单独的 HDF 存储中是否有意义?或者当我处理同一文件中的其他帧时,携带“未
我似乎无法让它发挥作用。所有示例和线程都让人创建新的数据集。我只想更新已创建的数据集中的一个字段。 这是我所拥有的: h5_file = h5py.File(event_file_path, "r+"
我在 hadoop 上写入小文件时遇到一个奇怪的问题。下面是示例程序 public void writeFile(Configuration conf, String message, String
当我运行 hdf namenode -format 时,它想要删除目录 /home/hadoop/hadooptmpdata/dfs/name/current 但它没有权限执行此操作。如何授予它权限?
有没有办法使用 pandas HDF 存储获取 HDF 表的信息? 例如在 SQL 中有: SELECT COUNT(*) 我想阅读基本表格大小而不必自己加载表格。 最佳答案 试试这个: In [4]
在 pandas 下,每次我使用表格格式而不是固定格式时,我的内存消耗都会爆炸。 import numpy as np np.random.seed(seed=10) df = pd.DataFram
我正在处理大量数据集,每个数据集都是一个 pandas DataFrame,由于它们的大小,我需要从磁盘访问它们。从我读到的内容来看,HDF 似乎是与它们一起工作的好方法,但我对构建数据的最佳方法有点
我正在开发云服务器,我需要使用 blob 存储来存储 HDF 文件 ( http://www.hdfgroup.org/HDF5/ )。 与文件中的创建、读取、写入和修改数据元素相关的函数来自 HDF
我正在尝试将数据存储为 hdf 格式,并希望将默认数据类型设置为表,以便稍后查询。 我正在使用基本代码: import pandas as pd from numpy import random as
我最近在 Lubuntu 上安装了 Anacondas Python。 我正在尝试加载可在 Windows PC 上运行的 HDF 文件: In [14]: import pandas as pd I
我写了下面的脚本,但是我有一个内存消耗的问题,pandas 分配了超过 30 G 的内存,其中数据文件的总和大约是 18 G import pandas as pd import numpy as n
您好,我看到了一些以 HDF5 格式存储的科学数据,我想知道是否有任何 NoSQl 解决方案可以达到与 HDF5 相同的读/写性能。 我的示例的数据使用树结构(/root 然后/root/key 然后
我想知道如何获取 hdf 文件的列名(似乎存储在 hdf header 中);例如,一个文件可能有名为 [a,b,c,d] 的列,而另一个文件有 [a,b,c] 列,而另一个文件有 [b,e,r,z]
我想做什么? pd.read_csv(... nrows=###) 可以读取文件的前 n 行。我想在使用 pd.read_hdf(...) 时做同样的事情。 问题是什么? 我对 documentati
我想将数千张动物图像加载到 pandas df 中,添加特征并可能转换为 HDF。 我使用 cv2.imread() 尝试了以下方法 import cv2 import os import numpy
我想知道 HDF 套件中嵌入的 kafka 和 Confluence 套件中嵌入的 kafka 之间的差异,特别是模式注册工具。 最佳答案 https://registry-project.readt
我想知道 HDF 套件中嵌入的 kafka 和 Confluence 套件中嵌入的 kafka 之间的差异,特别是模式注册工具。 最佳答案 https://registry-project.readt
我使用 pandas 和 hdf5 文件来处理大量数据(例如 10GB 或更多)。我想使用表格格式,以便在读取数据时能够有效地查询数据。但是,当我想将数据写入 hdf 存储时(使用 DataFrame
我是一名优秀的程序员,十分优秀!