Python numpy MemoryError-将多个CSV文件加载到HDF5存储中并读入DataFrame

马蒂斯

(使用Python 3.3和Pandas 0.12)

我的问题包括两部分。

第一的

我试图基于此解决方案此解决方案来创建唯一索引,将多个csv文件(总计总计约8GB)迭代读取/追加到HDF5存储中之所以开始执行此操作,是因为我读到这样做会导致文件可以快速访问并且相对较小,从而能够读入内存。但是事实证明,我得到的是一个18GB的h5文件。我的(Windows)笔记本电脑有8GB的RAM。我的第一个问题是,为什么生成的h5比原始csv文件的总和大得多?我的第二个问题是为什么我在表上确实没有得到唯一索引?

我的代码如下:

def to_hdf(path):
    """ Function that reads multiple csv files to HDF5 Store """
    # If path exists delete it such that a new instance can be created
    if os.path.exists(path):
        os.remove(path)
    # Creating HDF5 Store
    store = pd.HDFStore(path)

    # Reading csv files from list_files function
    with pd.get_store(path) as store:
        for f in list_files():
            try:
                # Creating reader in chunks -- reduces memory load
                df = pd.read_csv(f, encoding='utf-8', chunksize=50000, index_col=False)
                try:
                    nrows = store.get_storer('ta_store').nrows
                except:
                    nrows = 0
                # Looping over chunks and storing them in store file, node name 'ta_data'
                for chunk in df:
                    # Append chunk to store called 'ta_data'
                    store.append('ta_data', chunk, index=False, min_itemsize={'Placement Ref': 50, 'Click Ref': 50})
            # Print filename if corrupt (i.e. CParserError)
            except (parser.CParserError, ValueError) as detail:
                print(f, detail)

    print("Finished reading to HDF5 store, continuing processing data.")

第二

脚本的第二部分将HDF5存储读取到Pandas DataFrame中。为什么?因为我需要进行一些数据转换和过滤,才能获得想要输出到csv文件中的最终数据。但是,MemoryError使用以下代码读取HDF5存储的任何尝试都会得到

def read_store(filename, node):
    df = pd.read_hdf(filename, node)
    # Some data transformation and filtering code below

发生此错误的另一个示例是我想使用以下功能打印商店以显示索引不是唯一的:

def print_store(filename, node):
    store = pd.HDFStore(filename)
    print(store.select(node))

我的问题首先是如何克服MemoryError问题。我猜想我需要减小hdf5文件的大小,但是我对Programming / python / pandas很陌生,所以我很高兴收到任何输入。其次,我想知道是否将商店读入Pandas DataFrame是进行数据转换(创建一个新列)和过滤(基于字符串和日期时间值)的最有效方法。

很感谢任何形式的帮助!谢谢 :)

编辑

根据要求,从csv文件中检查一个样本(第一个),然后从中得到结果ptdump -av(下)

CSV样本

A               B   C               D       E           F           G         H                       I                   J       K               L                               M           N       O
4/28/2013 0:00  1   4/25/2013 20:34 View    Anon 2288 optional1   Optional2   Anon | 306742    252.027.323-306742  8.05    10303:41916417  14613669178715620788:10303      Duplicate   Anon  Display
4/28/2013 0:00  2   4/27/2013 13:40 View    Anon 2289 optional1   Optional2   Anon | 306742    252.027.323-306742  8.05    10303:41916417  14613669178715620788:10303      Duplicate   Anon  Display
4/28/2013 0:00  1   4/27/2013 23:41 View    Anon 5791 optional1   Optional2   Anon | 304142    478.323.464-304142  20.66   10304:37464168  14613663710835083509:10305      Duplicate   Anon  Display
4/28/2013 0:00  1   4/27/2013 16:18 View    Anon 4300 optional1   Optional2   Anon | 304142    196.470.934-304142  3.12    10303:41916420  15013670724970033908:291515610  Normal      Anon  Display

ptdump -av

/ (RootGroup) ''
  /._v_attrs (AttributeSet), 4 attributes:
   [CLASS := 'GROUP',
    PYTABLES_FORMAT_VERSION := '2.1',
    TITLE := '',
    VERSION := '1.0']
/ta_data (Group) ''
  /ta_data._v_attrs (AttributeSet), 14 attributes:
   [CLASS := 'GROUP',
    TITLE := '',
    VERSION := '1.0',
    data_columns := ['F', 'G'],
    encoding := 'UTF-8',
    index_cols := [(0, 'index')],
    info := {'index': {}},
    levels := 1,
    nan_rep := 'nan',
    non_index_axes := [(1, ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O'])],
    pandas_type := 'frame_table',
    pandas_version := '0.10.1',
    table_type := 'appendable_frame',
    values_cols := ['values_block_0', 'values_block_1', 'values_block_2', 'F', 'G']]
/ta_data/table (Table(41957511,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
  "values_block_1": Int64Col(shape=(1,), dflt=0, pos=2),
  "values_block_2": StringCol(itemsize=30, shape=(11,), dflt=b'', pos=3),
  "F": StringCol(itemsize=50, shape=(), dflt=b'', pos=4),
  "G": StringCol(itemsize=50, shape=(), dflt=b'', pos=5)}
  byteorder := 'little'
  chunkshape := (288,)
  /ta_data/table._v_attrs (AttributeSet), 27 attributes:
   [CLASS := 'TABLE',
    G_dtype := 'bytes400',
    G_kind := ['G'],
    FIELD_0_FILL := 0,
    FIELD_0_NAME := 'index',
    FIELD_1_FILL := 0.0,
    FIELD_1_NAME := 'values_block_0',
    FIELD_2_FILL := 0,
    FIELD_2_NAME := 'values_block_1',
    FIELD_3_FILL := b'',
    FIELD_3_NAME := 'values_block_2',
    FIELD_4_FILL := b'',
    FIELD_4_NAME := 'F',
    FIELD_5_FILL := b'',
    FIELD_5_NAME := 'G',
    NROWS := 41957511,
    F_dtype := 'bytes400',
    F_kind := ['F'],
    TITLE := '',
    VERSION := '2.7',
    index_kind := 'integer',
    values_block_0_dtype := 'float64',
    values_block_0_kind := ['J'],
    values_block_1_dtype := 'int64',
    values_block_1_kind := ['B'],
    values_block_2_dtype := 'bytes240',
    values_block_2_kind := ['E', 'O', 'A', 'H', 'C', 'D', 'L', 'N', 'M', 'K', 'I']]

转换和过滤示例

df['NewColumn'] = df['I'].str.split('-').str[0]

mask = df.groupby('NewColumn').E.transform(lambda x: x.nunique() == 1).astype('bool')
df = df[mask]
杰夫
  • 您需要解析csv中的日期,并尝试在添加parse_dates = ['A','C']添加read_csv如果执行df.get_dtype_count()这些操作,则应显示为datetime64[ns],否则它们是字符串,它们会占用很大的存储空间,并且不易使用

  • min_itemsize参数指定最小此字符串列的大小(“F”,“G”); 这只是为了确保您的字符串不超过此限制;但这会使该列的所有行都具有该宽度。如果您可以降低此尺寸,则会缩小您的存储空间

  • 您不是在创建唯一索引;而是在创建索引。上面的代码中缺少一行。df.index = Series(df.index) + nrows阅读后添加read_csv

  • 您需要像对csv文件一样,在块上对hdf进行迭代。请参阅此处,并在此处查看有关压缩的文档

目前尚不清楚您的过滤实际上要做什么;你能解释更多吗?您需要彻底了解HDF存储的工作原理(例如,可以追加行,但不能追加列;可能需要创建一个结果表,在其中追加转换/过滤后的前叉)。您还需要了解索引的工作方式,需要一种访问这些行的方式(全局唯一的方式可以做到这一点,但是可能不必依赖于数据的结构)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

克服 numpy 中的 MemoryError

来自分类Dev

Python中的Pickle的MemoryError

来自分类Dev

带有大文件的Python 2.5 MemoryError

来自分类Dev

带有分块上传的python中的MemoryError

来自分类Dev

Python / Windows不允许numpy分配RAM“ numpy.core._exceptions.MemoryError”

来自分类Dev

Python Pandas MemoryError

来自分类Dev

Python Pandas MemoryError

来自分类Dev

Python 3.6:处理 MemoryError

来自分类Dev

如何在Python中下载没有MemoryError的大文件?

来自分类Dev

如何在Python中下载没有MemoryError的大文件?

来自分类Dev

MemoryError的消息,因为在Python中str为空

来自分类Dev

在python中,MemoryError和OverflowError有什么区别?

来自分类Dev

将稀疏矩阵转换为密集矩阵时出现MemoryError错误?(numpy,scikit)

来自分类Dev

Python没有捕获MemoryError

来自分类Dev

Python MemoryError创建大型字典

来自分类Dev

Python没有捕获MemoryError

来自分类Dev

Python MemoryError创建大型字典

来自分类Dev

从大文件(〜2.5GB)读取并存储到python列表中时出现MemoryError

来自分类Dev

有没有更有效的方法将行从大文件追加到numpy数组?-MemoryError

来自分类Dev

Python:将文件加载到numpy数组时出错

来自分类Dev

熊猫DataFrame.merge MemoryError

来自分类Dev

使用python将tiff堆栈加载到numpy数组中

来自分类Dev

MemoryError-如何使用Python通过Google Drive SDK下载大文件

来自分类Dev

Python3.6下载1.3G大视频文件产生MemoryError

来自分类Dev

Python HDF5 / NumPy打印数组不同

来自分类Dev

np.loadtxt和iter_loadtxt中的Python MemoryError或ValueError

来自分类Dev

np.loadtxt和iter_loadtxt中的Python MemoryError或ValueError

来自分类Dev

为什么赋值操作仍然为 Python 中的大型数组提供 MemoryError?

来自分类Dev

在Python中将基于HDF5的文件读取为numpy数组

Related 相关文章

  1. 1

    克服 numpy 中的 MemoryError

  2. 2

    Python中的Pickle的MemoryError

  3. 3

    带有大文件的Python 2.5 MemoryError

  4. 4

    带有分块上传的python中的MemoryError

  5. 5

    Python / Windows不允许numpy分配RAM“ numpy.core._exceptions.MemoryError”

  6. 6

    Python Pandas MemoryError

  7. 7

    Python Pandas MemoryError

  8. 8

    Python 3.6:处理 MemoryError

  9. 9

    如何在Python中下载没有MemoryError的大文件?

  10. 10

    如何在Python中下载没有MemoryError的大文件?

  11. 11

    MemoryError的消息,因为在Python中str为空

  12. 12

    在python中,MemoryError和OverflowError有什么区别?

  13. 13

    将稀疏矩阵转换为密集矩阵时出现MemoryError错误?(numpy,scikit)

  14. 14

    Python没有捕获MemoryError

  15. 15

    Python MemoryError创建大型字典

  16. 16

    Python没有捕获MemoryError

  17. 17

    Python MemoryError创建大型字典

  18. 18

    从大文件(〜2.5GB)读取并存储到python列表中时出现MemoryError

  19. 19

    有没有更有效的方法将行从大文件追加到numpy数组?-MemoryError

  20. 20

    Python:将文件加载到numpy数组时出错

  21. 21

    熊猫DataFrame.merge MemoryError

  22. 22

    使用python将tiff堆栈加载到numpy数组中

  23. 23

    MemoryError-如何使用Python通过Google Drive SDK下载大文件

  24. 24

    Python3.6下载1.3G大视频文件产生MemoryError

  25. 25

    Python HDF5 / NumPy打印数组不同

  26. 26

    np.loadtxt和iter_loadtxt中的Python MemoryError或ValueError

  27. 27

    np.loadtxt和iter_loadtxt中的Python MemoryError或ValueError

  28. 28

    为什么赋值操作仍然为 Python 中的大型数组提供 MemoryError?

  29. 29

    在Python中将基于HDF5的文件读取为numpy数组

热门标签

归档