Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
在python中,当对象占用比数据本身更多的内存空间时,优化列表对象的好方法是什么_Python_String_List - Fatal编程技术网

在python中,当对象占用比数据本身更多的内存空间时,优化列表对象的好方法是什么

在python中,当对象占用比数据本身更多的内存空间时,优化列表对象的好方法是什么,python,string,list,Python,String,List,在python中,当对象占用比数据本身更多的内存空间时,优化列表对象的好方法是什么 假设我们有100M个字符串列表对象(可能来自long_string.split('\t')),每个字符串对象只包含几个字节的字符串数据,但对象本身需要几十个内存。python中有哪些好的替代解决方案?一个好的方法可能是不立即将它们存储在内存中,例如通过使用可按需生成对象的方法。一个好的方法可能是不立即将它们存储在内存中,例如通过使用可按需生成对象的方法 def split_lines(text): tem

在python中,当对象占用比数据本身更多的内存空间时,优化列表对象的好方法是什么


假设我们有100M个字符串列表对象(可能来自long_string.split('\t')),每个字符串对象只包含几个字节的字符串数据,但对象本身需要几十个内存。python中有哪些好的替代解决方案?

一个好的方法可能是不立即将它们存储在内存中,例如通过使用可按需生成对象的方法。

一个好的方法可能是不立即将它们存储在内存中,例如通过使用可按需生成对象的方法

def split_lines(text):
    temp = ''
    for char in text:
        if (char != '\n'):
            temp += char
        else:
            yield temp
            temp = ''
for each in split_lines(text):
     #process each line
我检查,这是有效的,但它似乎比仅仅使用更长的时间

for each in text.split('\n'):
    #process each line
但它节省了大量内存空间,因为文本数据中有数十亿行

我检查,这是有效的,但它似乎比仅仅使用更长的时间

for each in text.split('\n'):
    #process each line

但它节省了大量内存空间,因为文本数据中有数十亿行

我认为主要的问题是你在内存中读取整个文件,如果可能的话,你应该将文件分块读取并处理它们

file_object = open('filename', 'r')

while True:
    line = file_object.readline()
    if not line: break
    process_line(line)

我认为主要的问题是你在内存中读取整个文件,如果可能的话,你应该分块读取文件并处理它们

file_object = open('filename', 'r')

while True:
    line = file_object.readline()
    if not line: break
    process_line(line)

要一次处理多行大文件中的一行,请执行以下操作:

def main():
    with open('input_file.txt') as file:
        for line in file:
            process_line(line)
如果文件包含数字(例如,每行一个短整数),并且您需要所有数字,那么您可以使用:

从functools导入部分
从itertools导入imap
将numpy作为np导入
def计数_行(文件):
“”“返回文件中的行数。”“”

返回iter中块的总和(chunk.count('\n')(partial(file.read,1),一次处理多行大文件中的一行:

def main():
    with open('input_file.txt') as file:
        for line in file:
            process_line(line)
如果文件包含数字(例如,每行一个短整数),并且您需要所有数字,那么您可以使用:

从functools导入部分
从itertools导入imap
将numpy作为np导入
def计数_行(文件):
“”“返回文件中的行数。”“”

iter(partial)(file.read,1)中chunk的返回和(chunk.count('\n')。您在问什么?您在问什么数据结构最能有效地存储许多(在您的示例中为1亿)对象(字符串)?是的,如果有。这取决于你的应用程序。你真的需要将元素存储在内存中吗?你会在整个数据集上迭代一次吗?不止一次?现有生成器的答案可能对某些情况最好,但对某些应用程序可能不起作用。你的应用程序在做什么?你在问什么?你在问什么数据结构将是存储许多(在您的示例中为1亿)对象(字符串)的最有效方法?是的,如果有。这取决于你的应用程序。你真的需要将元素存储在内存中吗?你会在整个数据集上迭代一次吗?不止一次?现有生成器的答案可能对某些情况最好,但对某些应用程序可能不起作用。你的应用程序在做什么?这当然是一个解决方案。但是,我我认为这将花费许多I/O操作。关键是,我可以加载所有数据(仅数百MB),但我可能无法将文本拆分为数十亿个字符串对象(这将花费GB的内存空间,比原始数据多出几倍)。因此,将数据加载到内存并使用生成器处理可能是最有效的方法。您可以将其作为
写入文件中的行\u对象:进程\u行(行)
@chentingpc您是否尝试使用此方法测量运行时间?顺便说一句,如果您想提高IO速度,您也可以获取更大的批处理。当然,这是一个解决方案。但是,我认为这将花费许多I/O操作。关键是,我可以加载所有数据(仅数百MB),但我可能负担不起将文本拆分为数十亿个字符串对象(这将占用GBs的内存空间,比原始数据多出几倍)。因此,将数据加载到内存并使用生成器处理可能是最有效的方法。您可以将其作为
写入文件中的行\u对象:进程\u行(行)
@chentingpc您是否尝试使用此方法测量所用时间?顺便说一句,如果您想提高IO速度,您还可以获取更大的批处理
拆分行()
可能是一个更好的名称(您的代码将
文本拆分成几行;它不会拆分行)
拆分行()
可能是一个更好的名称(您的代码将
文本
拆分为几行;它不会拆分一行)。