Python不在大文件上应用正则表达式

Python不在大文件上应用正则表达式,python,regex,mmap,finite-element-analysis,Python,Regex,Mmap,Finite Element Analysis,下面是我试图在完整文件上应用正则表达式的代码。每当我在小于1MB的较小文件上测试此代码时 代码工作正常,但在大文件上它不工作,并返回空数组。下面是我试图解析的数据示例。 通常,它包含300万行这样的数据 import re import sys, getopt import mmap shakes = open(sys.argv[1:][0],'r') love = open(sys.argv[1:][1], "w") #moreLove = open (sys.argv[1:][2], "w

下面是我试图在完整文件上应用正则表达式的代码。每当我在小于1MB的较小文件上测试此代码时 代码工作正常,但在大文件上它不工作,并返回空数组。下面是我试图解析的数据示例。 通常,它包含300万行这样的数据

import re
import sys, getopt
import mmap

shakes = open(sys.argv[1:][0],'r')
love = open(sys.argv[1:][1], "w")
#moreLove = open (sys.argv[1:][2], "w")
#HardLove = open (sys.argv[1:][3], "w")

node =  re.compile('\*NODE[a-zA-Z, \r\n\t0-9\.-]+')
element3 = '\*ELEMENT, TYPE=S3RS[a-zA-Z, \r\n\t0-9\.=;_-]+'
element4 =  '\*ELEMENT, TYPE=S4RS[a-zA-Z, \r\n\t0-9\.=;_-]+'

m = mmap.mmap(shakes.fileno(), 0, access=mmap.ACCESS_READ)

line = node.findall(m.read().decode('utf-8'))
#for item in line:
#  love.write(item)
#print(m.read())
print(line)

我觉得你太花哨了。不需要将整个文件读入内存。只需打开文件并逐行迭代(对于f中的行)。您的示例只有
*节点
,但您试图将
*节点
匹配为区分大小写的。此外,您从未使用
元素3
元素4
,它们应该做些什么吗?我正在使用它们,但它们只是代码的下一步@JonathonReinhart我不能逐行迭代,因为F.E模型文件中有不同的块,必须立即搜索,而不是逐行搜索。作为旁注,mmap()ping一个文件,然后将其全部读取到物理内存中是毫无意义的。您应该改为将数据读入内存阵列中–300万行(每个行有4个数字)将使用大约50MB的内存。
*Assembly, name=Assembly
**  
*Instance, name=vessel-1, part=vessel_bot
*Node
      1,   24.8572464,     213.8125,   53.1415176
      2,   41.4983292,     213.8125,   41.4983292
      3,   44.4593391,     213.8125,   44.4593391
      4,   28.0079861,     213.8125,   56.2922592
      5,   24.8572464,     233.8125,   53.1415176
      6,   28.0079861,     233.8125,   56.2922592
      7,   48.2778168,     233.8125,   61.0057411
      8,    46.156498,     233.8125,   61.0057411
      9,   53.5811195,     223.3125,   53.5811195
     10,    54.641777,     224.8125,    54.641777
     11,   49.6920319,     233.8125,   62.4199524
     12,   56.0559921,     224.8125,   56.0559921
     13,   50.7526894,     233.8125,   61.3592911
     14,   56.0559921,     226.3125,   56.0559921
     15,   41.4983292,     226.3125,   41.4983292
     16,   35.8528366,     233.8125,   46.4594383
     17,   37.5893517,     233.8125,   52.4385948
     18,   45.8735542,     223.3125,   45.8735542
     19,   44.4593391,     221.3125,   44.4593391
     20,   35.0599136,     233.8125,   52.1926079
     21,   34.0794373,     233.8125,    44.686039
     22,   31.5089321,     233.8125,   44.4683838
     23,   38.5373192,     243.3125,   38.5373192