Questions tagged «large-data»

16
使用熊猫的“大数据”工作流程
在学习熊猫的过程中,我试图迷惑了这个问题很多月。我在日常工作中使用SAS,这非常有用,因为它提供了核心支持。但是,由于许多其他原因,SAS作为一个软件也是很糟糕的。 有一天,我希望用python和pandas取代我对SAS的使用,但是我目前缺少大型数据集的核心工作流程。我不是在谈论需要分布式网络的“大数据”,而是文件太大而无法容纳在内存中,但文件又足够小而无法容纳在硬盘上。 我的第一个想法是用来HDFStore将大型数据集保存在磁盘上,然后仅将需要的部分拉入数据帧中进行分析。其他人提到MongoDB是更易于使用的替代方案。我的问题是这样的: 什么是实现以下目标的最佳实践工作流: 将平面文件加载到永久的磁盘数据库结构中 查询该数据库以检索要输入到熊猫数据结构中的数据 处理熊猫中的片段后更新数据库 现实世界中的示例将不胜感激,尤其是那些从“大数据”中使用熊猫的人。 编辑-我希望如何工作的示例: 迭代地导入一个大的平面文件,并将其存储在永久的磁盘数据库结构中。这些文件通常太大而无法容纳在内存中。 为了使用Pandas,我想读取这些数据的子集(通常一次只读取几列),使其适合内存。 我将通过对所选列执行各种操作来创建新列。 然后,我将不得不将这些新列添加到数据库结构中。 我正在尝试找到执行这些步骤的最佳实践方法。阅读有关熊猫和pytables的链接,似乎添加一个新列可能是个问题。 编辑-专门回答杰夫的问题: 我正在建立消费者信用风险模型。数据类型包括电话,SSN和地址特征;财产价值;犯罪记录,破产等贬义信息。我每天使用的数据集平均有近1,000到2,000个字段,这些字段是混合数据类型:数字和字符数据的连续,名义和有序变量。我很少追加行,但是我确实执行许多创建新列的操作。 典型的操作涉及使用条件逻辑将几个列合并到一个新的复合列中。例如,if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'。这些操作的结果是数据集中每个记录的新列。 最后,我想将这些新列添加到磁盘数据结构中。我将重复步骤2,使用交叉表和描述性统计数据探索数据,以寻找有趣的直观关系进行建模。 一个典型的项目文件通常约为1GB。文件组织成这样的方式,其中一行包含消费者数据记录。每条记录的每一行都有相同的列数。情况总是如此。 创建新列时,我会按行进行子集化是非常罕见的。但是,在创建报告或生成描述性统计信息时,对行进行子集化是很常见的。例如,我可能想为特定业务创建一个简单的频率,例如零售信用卡。为此,除了我要报告的任何列之外,我将只选择那些业务线=零售的记录。但是,在创建新列时,我将拉出所有数据行,而仅提取操作所需的列。 建模过程要求我分析每一列,寻找与某些结果变量有关的有趣关系,并创建描述这些关系的新复合列。我探索的列通常以小集合形式完成。例如,我将集中讨论一组20个仅涉及属性值的列,并观察它们与贷款违约的关系。一旦探索了这些列并创建了新的列,我便转到另一组列,例如大学学历,并重复该过程。我正在做的是创建候选变量,这些变量解释我的数据和某些结果之间的关系。在此过程的最后,我应用了一些学习技术,这些技术可以根据这些复合列创建方程。 我很少向数据集添加行。我几乎总是会创建新列(统计/机器学习术语中的变量或功能)。

7
是什么导致Python分段错误?
我正在用Python实现Kosaraju的强连接组件(SCC)图搜索算法。 该程序可以在较小的数据集上很好地运行,但是当我在超大图形(超过800,000个节点)上运行它时,它会显示“ Segmentation Fault”。 可能是什么原因造成的?谢谢! 附加信息:首先,我在超大型数据集上运行时遇到此错误: "RuntimeError: maximum recursion depth exceeded in cmp" 然后我使用设置重置递归限制 sys.setrecursionlimit(50000) 但是出现了“细分错误” 相信我这不是一个无限循环,它可以在相对较小的数据上正确运行。程序是否可能耗尽了资源?

4
多处理中的共享内存
我有三个大名单。前一个包含位数组(模块位数组0.8.0),另外两个包含整数数组。 l1=[bitarray 1, bitarray 2, ... ,bitarray n] l2=[array 1, array 2, ... , array n] l3=[array 1, array 2, ... , array n] 这些数据结构占用相当多的RAM(总计约16GB)。 如果我使用以下方法启动12个子流程: multiprocessing.Process(target=someFunction, args=(l1,l2,l3)) 这是否意味着将为每个子流程复制l1,l2和l3,或者子流程将共享这些列表?或者更直接地说,我将使用16GB还是192GB的RAM? someFunction将从这些列表中读取一些值,然后根据读取的值执行一些计算。结果将返回到父进程。列表l1,l2和l3不会被someFunction修改。 因此,我假设子流程不需要并且不会复制这些庞大的列表,而只会与父级共享它们。意味着由于linux下的写时复制方法,该程序将占用16GB的RAM(无论我启动了多少个子进程)?我是对的还是我遗漏了一些会导致列表被复制的东西? 编辑:在阅读了有关该主题的更多内容后,我仍然感到困惑。一方面,Linux使用写时复制,这意味着没有数据被复制。另一方面,访问对象将更改其引用计数(我仍然不确定为什么以及这意味着什么)。即使这样,会复制整个对象吗? 例如,如果我定义someFunction如下: def someFunction(list1, list2, list3): i=random.randint(0,99999) print list1[i], list2[i], list3[i] 使用此功能是否意味着将为每个子流程完全复制l1,l2和l3? 有办法检查吗? EDIT2在多了一点并监视子进程运行时系统的总内存使用情况之后,似乎确实为每个子进程复制了整个对象。这似乎是因为引用计数。 在我的程序中,实际上不需要l1,l2和l3的引用计数。这是因为l1,l2和l3将保留在内存中(不变),直到父进程退出。在此之前,无需释放这些列表使用的内存。实际上,我可以肯定的是,在程序退出之前,引用计数将保持高于0(对于这些列表和这些列表中的每个对象)。 所以现在的问题变成了,我如何确保对象不会复制到每个子流程?我是否可以禁用这些列表以及这些列表中每个对象的引用计数? EDIT3只是一个附加说明。子进程并不需要修改l1,l2并l3或在这些列表中的任何对象。子流程仅需要能够引用其中一些对象,而无需为每个子流程复制内存。

4
如果使用可枚举的大对象,Parallel.ForEach可能会导致“内存不足”异常
我正在尝试将数据库中存储了图像的数据库迁移到数据库中指向硬盘驱动器上文件的记录。我试图使用这种方法来Parallel.ForEach加快查询速度,以查询出数据。 但是,我注意到我遇到了OutOfMemory异常。我知道Parallel.ForEach将查询一批可枚举的对象,以减少开销(如果有一个用于将查询间隔开)(因此,如果您一次执行一堆查询而不是将它们间隔开,那么您的源将更有可能将下一条记录缓存在内存中出来)。问题是由于我返回的记录之一是一个1-4Mb字节数组,缓存导致整个地址空间用完(该程序必须以x86模式运行,因为目标平台将是32位机) 有什么方法可以禁用缓存或使TPL的缓存更小吗? 这是显示问题的示例程序。这必须在x86模式下进行编译,以显示问题,如果它花费很长时间或在您的计算机上没有发生,则增大了阵列的大小(我发现1 << 20在我的计算机上花费了大约30秒的时间,并且4 << 20几乎是瞬时的) class Program { static void Main(string[] args) { Parallel.ForEach(CreateData(), (data) => { data[0] = 1; }); } static IEnumerable<byte[]> CreateData() { while (true) { yield return new byte[1 << 20]; //1Mb array } } }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.